查
我想要的结果:前端上传的文件和字段自动按照实体类对应 然后利用 实体效验 减少 不必要的 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;
}
然后 就可以愉快玩耍了