Owin WebAPI上传文件

简介: Owin是微软出了几年的东东了,一直没时间学习。大概了解了下,是一个脱离IIS环境,快速搭建WebAPI服务的东西。 刚好想尝试下尽量脱离IIS创建简单快捷配置的项目,就是用了Nginx+Owin的模式,前端用Nignx部署html网页,配置反向代理方便ajax访问owin提供的WebAPI接口。

Owin是微软出了几年的东东了,一直没时间学习。大概了解了下,是一个脱离IIS环境,快速搭建WebAPI服务的东西。

刚好想尝试下尽量脱离IIS创建简单快捷配置的项目,就是用了Nginx+Owin的模式,前端用Nignx部署html网页,配置反向代理方便ajax访问owin提供的WebAPI接口。

一切都进行的非常顺利,直到遇到上传。

先看看之前使用MVC时候的WebAPI上传文件的方法:

     /// <summary>
        /// 上传图片
        /// </summary>
        /// <param name="form"></param>
        /// <returns></returns>
        [IgnoreAuthority(IgnoreType.IgnoreFeature)]
        [HttpPost]
        public async Task<JsonResult> UploadImgFile(FormCollection form)
        {
            OperateStatus operateStatus = new OperateStatus();
            if (Request.Files.Count == 0)
            {
                operateStatus.ResultSign = ResultSign.Error;
                operateStatus.Message = "没有找到上传文件";
            }
            else
            {
                HttpPostedFileBase file = Request.Files[0];
                if (file.ContentLength == 0)
                {
                    operateStatus.ResultSign = ResultSign.Error;
                    operateStatus.Message = "文件大小不能为0";
                }
                else
                {
                   
                }
            }

            return await Task.FromResult(Json(operateStatus));
        }

  直接拷贝过来,发现FormCollection 不存在啦,存在的也是owin旗下的FormCollection ,采用其他方案,于是又如下代码:

        /// <summary>
        /// 图片上传  [FromBody]string token
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        [Route("api/Upload/ImgUpload")]
        public Task<Hashtable> ImgUpload()
        {
            // 检查是否是 multipart/form-data 
            if (!Request.Content.IsMimeMultipartContent("form-data"))
                throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);

            // 文件保存目录路径 
            const string saveTempPath = "~/UploadFiles/";
            var dirTempPath = HttpContext.Current.Server.MapPath(saveTempPath);

            // 设置上传目录 
            var provider = new MultipartFormDataStreamProvider(dirTempPath);

            ................后面的没啥用,不粘贴了
        }        

  这样写倒是也可以啦,解决了上传问题,可是这个方法必须把文件保存在服务器上。第一我不想保存文件,只想获取文件流。第二owin搭建的服务也没有保存的位置。于是这种方式排除,下面看最终的代码:

        /// <summary>
        /// 上传图片
        /// </summary>
        /// <returns></returns>
        public async Task<ResultObj> UploadImgFile()
        {
            ResultObj resultObj = new ResultObj()
            {
                Success = false
            };

            var provider = new MultipartMemoryStreamProvider();

            //读取文件数据
            await Request.Content.ReadAsMultipartAsync(provider);

            if (provider.Contents.Count == 0)
            {
                resultObj.Msg = "没有文件";
            }
            else
            {
                var item = provider.Contents[0];
                // 判断是否是文件
                if (item.Headers.ContentDisposition.FileName != null)
                {
                    //获取到流
                    var ms = item.ReadAsStreamAsync().Result;
                    //进行流操作
                    using (var br = new BinaryReader(ms))
                    {
                        if (ms.Length <= 0)
                        {
                            resultObj.Msg = "文件长度为空";
                        }
                        //读取文件内容到内存中
                        byte[] data = br.ReadBytes((int) ms.Length);
                        //data就是取出的文件流啦
                        ........
    
                    }
                }
                else
                {
                    resultObj.Msg = "未知的上传内容";
                }
            }

            return resultObj;
        }

  为了这个,百度了一个下午,还是自己基础太差了。希望对有这方面需求的人有参考吧。

 

  更多个人工作中的项目请访问我的个人网站:www.88gis.cn

相关文章
|
JavaScript 前端开发 CDN
skycons.js 基于canvas的天气动态js插件
skycons.js 基于canvas的天气动态js插件
594 0
skycons.js 基于canvas的天气动态js插件
|
2月前
|
缓存 NoSQL Java
[006][缓存模块] 两级缓存实战:基于 Caffeine + Redis 的多级缓存设计与实现
本文介绍基于Caffeine(本地)+ Redis(分布式)的两级缓存实战方案,通过自定义`MultiLevelCache`与`MultiLevelCacheManager`,实现Spring Cache标准接口下的透明多级缓存:读优先本地(纳秒级)、未命中查Redis并回填;写同步更新两级,兼顾高性能与数据共享。代码开源可直接集成。
255 0
|
3月前
|
存储 关系型数据库 Nacos
分布式事务解决方案Seata之SeataServer部署
本文以Seata 1.6.1为例,详解分布式事务一致性解决方案:涵盖Seata Server部署、Nacos配置中心与MySQL存储集成、核心配置说明、数据库表初始化及启动验证,助力开发者快速落地强/最终一致性事务实践。(238字)
601 1
分布式事务解决方案Seata之SeataServer部署
|
3月前
|
人工智能 自然语言处理 JavaScript
小龙虾本地最简单的安装方法,直接安装其他的都弱爆了
OpenClaw虾壳云是一款面向Windows 10/11的AI自动化工具,v2.6.0版支持一键安装、全程可视化操作,内置Python/Node.js等全部依赖,5分钟极速部署。无需命令行,新手友好;需关闭杀软,路径须纯英文。开源可信,即装即用!
|
开发框架 Java 编译器
2025年1月推荐-工欲善其事,必先利其器-程序员必备之-核心基本工具—不要看什么国际排行榜-没有用-编辑器和编译器推荐-优雅草央千澈
2025年1月推荐-工欲善其事,必先利其器-程序员必备之-核心基本工具—不要看什么国际排行榜-没有用-编辑器和编译器推荐-优雅草央千澈
860 1
|
机器学习/深度学习 人工智能 Kubernetes
开源AI驱动的商业综合体保洁管理——智能视频分析系统的技术解析
智能保洁管理系统通过计算机视觉与深度学习技术,解决传统保洁模式中监管难、效率低的问题。系统涵盖垃圾滞留监测、地面清洁度评估、设施表面检测等功能,实现高精度(96%以上)、实时响应(&lt;200毫秒)。基于开源TensorFlow与Kubernetes架构,支持灵活部署与定制开发,适用于商场、机场等场景,提升管理效率40%以上。未来可扩展至气味监测等领域,推动保洁管理智能化升级。
633 26
|
安全 Java Shell
【内网—内网转发】——http协议代理转发_reGeorg代理转发
【内网—内网转发】——http协议代理转发_reGeorg代理转发
860 3
|
人工智能 架构师 自动驾驶
期待已久,真正的 AI 程序员来了
6 月 21 日,在阿里云上海 AI 峰会上,阿里云推出首个“AI 程序员”,它具备架构师、开发工程师、测试工程师等多种岗位的技能,能一站式自主完成任务分解、代码编写、测试、问题修复、代码提交整个过程,最快分钟级即可完成应用开发,大幅提升研发效率。
2061 126
|
存储 安全 Linux
NFS使用TrueNAS SCALE的好处
从Linux自带的NFS转向TrueNAS SCALE,因其不仅提供块服务(iSCSI),还内置压缩功能。通过WEB界面开启SSH并设置Allow Password Authentication。安全配置方面,限制特定IP访问NFS输出。对比发现,对于文本文件,TrueNAS SCALE展现出显著的压缩优势,如日志文件压缩率接近90%,大大节省了存储空间,而对已压缩文件则无明显变化。这一转变有效优化了存储效率和安全性。
569 0