恰好想测验考试下尽量脱离IIS创建简单快捷配置的项目,就是用了Nginx+Owin的模式,前端用Nignx部署html网页,配置反向代办代理便利ajax访谒owin供给的WebAPI接口。
一切都进行的非常顺利,直到遇到上传。
先看看之前使用MVC时候的WebAPI上传文件的要领:
/// <summary> /// 上传图片 /// </summary> /// <param></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; }
为了这个,,百度了一个下午,还是本身根本太差了。但愿对有这方面需求的人有参考吧。