File upload 是否可以在asp.net webapi中使用上载的文件进行modelbinding?
模型:File upload 是否可以在asp.net webapi中使用上载的文件进行modelbinding?,file-upload,asp.net-web-api,model-binding,File Upload,Asp.net Web Api,Model Binding,模型: public class UploadFileModel { public int Id { get; set; } public string FileName { get; set; } public HttpPostedFileBase File { get; set; } } 控制员: public void Post(UploadFileModel model) { // never arrives... } 我犯了一个错误 “没有Medi
public class UploadFileModel
{
public int Id { get; set; }
public string FileName { get; set; }
public HttpPostedFileBase File { get; set; }
}
控制员:
public void Post(UploadFileModel model)
{
// never arrives...
}
我犯了一个错误
“没有MediaTypeFormatter可用于从媒体类型为“multipart/form data”的内容中读取“UploadFileModel”类型的对象。”
这有什么办法吗?这不容易做到。WebAPI中的模型绑定与MVC中的模型绑定有着根本性的不同,您必须编写一个MediaTypeFormatter,将文件流读入您的模型中,并额外绑定原语,这可能非常具有挑战性
最简单的解决方案是使用某种类型的MultipartStreamProvider
从请求中获取文件流,并使用FormData
name-value收集从该提供程序获取其他参数
示例-:
public异步任务PostFormData()
{
如果(!Request.Content.IsMimeMultipartContent())
{
抛出新的HttpResponseException(HttpStatusCode.UnsupportedMediaType);
}
string root=HttpContext.Current.Server.MapPath(“~/App_Data”);
var provider=新的MultipartFormDataStreamProvider(根);
尝试
{
wait Request.Content.ReadAsMultipartAsync(提供程序);
//显示所有键值对。
foreach(provider.FormData.AllKeys中的var键)
{
foreach(provider.FormData.GetValues(键)中的var val)
{
Trace.WriteLine(string.Format(“{0}:{1}”,key,val));
}
}
返回Request.CreateResponse(HttpStatusCode.OK);
}
捕获(System.e例外)
{
返回请求.CreateErrorResponse(HttpStatusCode.InternalServerError,e);
}
}
您可以使用MediaTypeFormatter定义格式化程序来处理媒体类型数据。这里有一个很好的解释:可能是
public async Task<HttpResponseMessage> PostFormData()
{
if (!Request.Content.IsMimeMultipartContent())
{
throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
}
string root = HttpContext.Current.Server.MapPath("~/App_Data");
var provider = new MultipartFormDataStreamProvider(root);
try
{
await Request.Content.ReadAsMultipartAsync(provider);
// Show all the key-value pairs.
foreach (var key in provider.FormData.AllKeys)
{
foreach (var val in provider.FormData.GetValues(key))
{
Trace.WriteLine(string.Format("{0}: {1}", key, val));
}
}
return Request.CreateResponse(HttpStatusCode.OK);
}
catch (System.Exception e)
{
return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, e);
}
}