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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM