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

相关文章
|
机器学习/深度学习 算法 PyTorch
动物姿态识别+数据集+代码
动物姿态识别+数据集+代码
|
算法 Windows
Winform控件优化之实现无锯齿的圆角窗体(或任意图形的无锯齿丝滑的窗体或控件)【借助LayeredWindow】
在一般能搜到的所有实现圆角窗体的示例中,都有着惨不忍睹的锯齿...而借助于Layered Windows,是可以实现丝滑无锯齿效果的Form窗体的,其具体原理就是分层窗体....
2228 0
Winform控件优化之实现无锯齿的圆角窗体(或任意图形的无锯齿丝滑的窗体或控件)【借助LayeredWindow】
|
安全 Java Shell
【内网—内网转发】——http协议代理转发_reGeorg代理转发
【内网—内网转发】——http协议代理转发_reGeorg代理转发
586 3
|
9月前
|
机器学习/深度学习 监控
DeepSeek进阶开发与应用3:DeepSeek中的模型调优技术
本文深入探讨了DeepSeek框架中的模型调优技术,涵盖超参数优化、正则化方法及回调函数的应用。通过学习率调整、网格搜索、L1/L2正则化、Dropout、提前停止和模型检查点等具体示例,帮助读者掌握提升模型性能和防止过拟合的方法。文中还介绍了如何使用回调函数监控和调整训练过程,确保模型在大规模数据集上高效训练。
|
9月前
|
人工智能 关系型数据库 分布式数据库
3月5日(周三),Data+AI Workshop(深圳站)邀您参加!
本期沙龙将深度解析阿里云自研数据库PolarDB与AI的融合,涵盖应用场景、核心技术及实践案例,助力企业快速拥抱AI,实现业务落地和价值创造。立即免费报名参加,前50位参会者还可获精美伴手礼!
|
存储 缓存 Linux
【实战指南】嵌入式RPC框架设计实践:六大核心类构建高效RPC框架
在先前的文章基础上,本文讨论如何通过分层封装提升一个针对嵌入式Linux的RPC框架的易用性。设计包括自动服务注册、高性能通信、泛型序列化和简洁API。框架分为6个关键类:BindingHub、SharedRingBuffer、Parcel、Binder、IBinder和BindInterface。BindingHub负责服务注册,SharedRingBuffer实现高效数据传输,Parcel处理序列化,而Binder和IBinder分别用于服务端和客户端交互。BindInterface提供简单的初始化接口,简化应用集成。测试案例展示了客户端和服务端的交互,验证了RPC功能的有效性。
727 72
|
SQL Java 关系型数据库
JPA 之 QueryDSL-JPA 使用指南2
JPA 之 QueryDSL-JPA 使用指南2
1510 1
|
负载均衡 网络协议 算法
|
自然语言处理 Java 索引
ElasticSearch 实现分词全文检索 - delete-by-query
ElasticSearch 实现分词全文检索 - delete-by-query
164 1
|
SQL Java 数据库连接
JPA 之 QueryDSL-JPA 使用指南
JPA 之 QueryDSL-JPA 使用指南
1108 0