查
我想要的結果:前端上傳的文件和字段自動按照實體類對應 然後利用 實體效驗 減少 不必要的 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;
}
然後 就可以愉快玩耍了