文件上传 – 是否可以在上传文件的asp.net webapi中进行模型绑定?

该模型:
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...
}

我收到了一个错误

“No MediaTypeFormatter is available to read an object of type ‘UploadFileModel’ from content with media type ‘multipart/form-data’.”

有没有办法解决

解决方法

这不容易. Web API中的模型绑定与MVC根本不同,您必须编写一个MediaTypeFormatter,它将文件流读入您的模型,并另外绑定可能相当具有挑战性的原语.

最简单的解决方案是使用某种类型的MultipartStreamProvider从请求中获取文件流,并使用该提供程序使用FormData名称值集合的其他参数

示例 – http://www.asp.net/web-api/overview/working-with-http/sending-html-form-data,-part-2

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);
    }
}

相关文章

项目要求通过网站上传大文件,比如视频文件,通过摸索实现了文件分片来上传,然后后台进行合并。 使用了...
安装新版本的Nginx(vim /etc/yum.repos.d/nginx.repo) [nginx-stable] name=nginx stable repo baseu...
什么是 SignalR&#160;ASP.NET Core ASP.NET Core SignalR 是一种开放源代码库,可简化将实时 web 功...
在Windows下使用Docker,我们选择Docker Desktop这个软件,非常方便。 ## Docker Desktop介绍及安装 Do...
项目开始设计的是运行在windows下,所以一开始采用的是windows服务模式来获取多媒体文件信息,后来要求...
银河麒麟高级服务器操作系统V10是针对企业级关键业务,适应虚拟化、云计算、大数据、工业互联网时代对主...