• 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

  • 相关阅读:
    Android中的5种数据存储方式
    Android Service
    Android BroadcastReceiver
    Android Intent
    Android Fragment
    Android 教学实验计划1
    【Android教学用例程序】计算器
    Android UI 基础知识
    Android 控件
    Android 计算器布局测试2
  • 原文地址:https://www.cnblogs.com/tracyjfly/p/8042187.html
Copyright © 2020-2023  润新知