我有一个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 */
}
这显然不起作用,虽然模型本身是null,我不明白为什么。我原以为它会绑定属性而忽略文件。
第2版:
public IHttpActionResult Post(Person entity, HttpPostedFileBase somefile) {
/* some code */
}
在客户端输入的表单中也尝试使用不同的名称(文件,fileUpload,文件,HttpPostedFile,HttpPostedFileBase)
第3版:
public IHttpActionResult Post(HttpPostedFileBase somefile) {
/* some code */
}
somefile在这里也是null。
第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 */
}
自定义活页夹从未调用。
我可以从上下文请求表单中访问文件,但模型非常复杂,这意味着我必须自己绑定它的属性。如果框架中已有一个绑定器,我不想写一个绑定器。 有没有办法解决这个问题?
答案 0 :(得分:0)
看一下这个答案Open Weather API。同样基于https://stackoverflow.com/a/19746825/2138959,您可以阅读多部分表单数据。第一部分将代表模型,您可以使用媒体类型格式化程序映射到模型,以避免手动属性映射,然后使用文件读取第二部分并手动将文件设置为模型。