2017-03-19 43 views
2

我有一个webapi项目,并不能找出一个很好的方式来绑定上传的文件内容。asp.net 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 */ 
} 

还与不同的名称试图在形式输入在客户端(文件,文件上传,文件,HttpPostedFile,HttpPostedFileBase)

版本3:

public IHttpActionResult Post(HttpPostedFileBase somefile) { 
    /* some code */ 
} 

somefile在这里也是空的。

版本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

你可以绑定模型,然后从请求中读取文件信息到它吗? –

回答