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