WEB API 通過 實體上傳 字段和 圖片列表



我想要的結果:前端上傳的文件和字段自動按照實體類對應 然後利用   實體效驗   減少 不必要的 if 判斷

我寫完這個 方法後 測試報錯:postman的報錯

 

{

    "Message": "此資源不支持請求實體的媒體類型“multipart/form-data”。",

    "ExceptionMessage": "沒有可用的 MediaTypeFormatter,無法從媒體類型爲“multipart/form-data”的內容中讀取類型爲“Model”的對象。",

    "ExceptionType": "System.Net.Http.UnsupportedMediaTypeException",

    "StackTrace": "   在 System.Net.Http.HttpContentExtensions.ReadAsAsync[T](HttpContent content, Type type, IEnumerable`1 formatters, IFormatterLogger formatterLogger, CancellationToken cancellationToken)\r\n   在 System.Web.Http.ModelBinding.FormatterParameterBinding.ReadContentAsync(HttpRequestMessage request, Type type, IEnumerable`1 formatters, IFormatterLogger formatterLogger, CancellationToken cancellationToken)"

}

谷歌瀏覽器的報錯:

爲了解決上面的問題 找到了 文章 https://www.cnblogs.com/kingCpp/p/4901268.html   瞭解到 webapi 似乎默認不支持這種方式的上傳

在nuget  安裝了  MultipartDataMediaFormatter   用來支持 我們直接從實體中獲取 文件

安裝後 配置一下

  //爲了實現通過實體類獲取文件
            GlobalConfiguration.Configuration.Formatters.Add(new FormMultipartEncodedMediaTypeFormatter());

如下:

OK 到了 這一步測試下 發現 谷歌瀏覽器發過來 的 name 映射上了 但是 文件沒映射上 但是  

HttpContext.Current.Request.Files 是可以拿到文件的

看看 postman 的情況:發現也是文件映射爲 null

HttpContext.Current.Request.Files 是可以拿到文件的

這裏爲了讓 文件映射上 實體類上的 Pictures 改了 各種 Content-type 發現還是沒用

既然實體已經進來了 滿足我我做實體效驗的需求   那這個  文件部分 我們就手動從 HttpContext.Current.Request.Files拿一下 賦值給 Picture  
所以寫個方法:

 public static List<HttpPostedFile> GetFileList()
        {
            if (HttpContext.Current.Request.Files.Count==0)
                return null;

            List<HttpPostedFile> res = new List<HttpPostedFile>();
            for (int i = 0; i < HttpContext.Current.Request.Files.Count; i++)
            {
                res.Add(HttpContext.Current.Request.Files[i]);
            }
            return res;
        }

然後 就可以愉快玩耍了  

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章