我有一个webapi项目,无法找到一个很好的方法来绑定上传的文件内容。
我有一个实体框架模型如下:
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
public UploadedFileId UploadedFileId { get; set; }
public virtual UploadedFile UploadedFile { get; set; }
}
上传的文件如下:
public class UploadedFile
{
public int Id { get; set; }
public byte[] Content { get; set; }
public string FileName { get; set; }
}
我在客户端有一个SPA,上面有上传文件的表单,
在控制器中,我尝试让模型绑定与文件上传一起工作,但我的尝试都不起作用。
第1版:
using System.Web.Http;
...
public IHttpActionResult Post(Person entity) {
/* some code */
}
这显然不起作用,虽然模型本身是空的,但我不明白为什么。我原以为它会绑定属性,只是忽略了这个文件。
第2版:
public IHttpActionResult Post(Person entity, HttpPostedFileBase somefile) {
/* some code */
}
还尝试在客户端输入的表单中使用不同的名称(文件、fileUpload、文件、HttpPostedFile、HttpPostedFileBase)
第3版:
public IHttpActionResult Post(HttpPostedFileBase somefile) {
/* some code */
}
有些文件在这里也是空的。
版本4:尝试创建绑定
public class UploadedFilesModelBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
HttpPostedFileBase file =controllerContext.HttpContext.Request.Files[bindingContext.ModelName];
var uploadFile = new UploadedFile();
uploadFile.FileName = file.FileName;
uploadFile.Content = new byte[(int)file.InputStream.Length];
file.InputStream.Read(uploadFile.Content, 0, (int)file.InputStream.Length);
return uploadFile;
}
}
Global.asax
ModelBinders.Binders[typeof(UploadedFile)] = new UploadedFilesModelBinder();
控制器
public IHttpActionResult Post(UploadedFile somefile) {
/* some code */
}
定制活页夹从来没打过电话。
我可以从上下文请求表单访问文件,但是模型非常复杂,这意味着我必须自己绑定它的属性。如果框架中已经有一个活页夹,我不想写一个活页夹。有没有办法解决这个问题?
发布于 2017-03-19 04:28:23
看看这个答案,https://stackoverflow.com/a/19746825/2138959。另外,基于在HTML中发送ASP.NET表单数据:文件上传和多部分MIME,您可以读取多部分表单数据。第一部分表示模型,您可以用媒体类型格式化程序映射到模型,以避免手动属性映射,然后用文件读取第二部分,然后手动将文件设置为模型。
https://stackoverflow.com/questions/42886119
复制