28

按照 ASP.NET 上的教程,实现了一个 Web API 控制器方法来进行异步文件上传,如下所示:

public Task<HttpResponseMessage> PostFormData()
{
    // Check if the request contains multipart/form-data.
    if (!Request.Content.IsMimeMultipartContent())
    {
        throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
    }

    string root = HttpContext.Current.Server.MapPath("~/App_Data");
    var provider = new MultipartFormDataStreamProvider(root);

    // Read the form data and return an async task.
    var task = Request.Content.ReadAsMultipartAsync(provider).
        ContinueWith<HttpResponseMessage>(t =>
        {
            if (t.IsFaulted || t.IsCanceled)
            {
                Request.CreateErrorResponse(HttpStatusCode.InternalServerError, t.Exception);
            }

            return Request.CreateResponse(HttpStatusCode.OK);
        });

    return task;
}

通过标准的多部分 HTML 表单上传文件非常有效。但是,当另一个开发人员尝试通过 Flex 的 FileReference 类构造的多部分表单上传文件时,会引发错误:

MIME 多部分流的意外结束。MIME 多部分消息不完整。

我不知道问题出在 Web API 还是 Flex 上。我发现了一些没有影响的相关修复(使用 ASP.Net Web API 的 Multipart form POST),以及最近的这个(“MIME multipart stream.MIME multipart message is not complete”error on webapi upload)。如果第二个链接成立,有谁知道它是否出现在通过 Nuget 提供的当前 Web API 版本中?讨论是在 5 月,Nuget 的最新版本是 8 月,所以我假设这个修复程序已经部署,并且不是我问题的根本原因。

4

7 回答 7

37

我对 MVC4 有同样的问题,但是 Will 是正确的,在你的输入中添加一个名称.....

<input type="file" id="fileInput" name="fileInput"/>

所有的魔法都恢复了并开始工作了!

于 2013-08-13T14:43:28.677 回答
36

我对 flex 也有同样的问题。下面是解决它的代码。基本上,我使用自定义流来附加 asp.net web api 所期望的换行符。

        Stream reqStream = Request.Content.ReadAsStreamAsync().Result;
        MemoryStream tempStream = new MemoryStream();
        reqStream.CopyTo(tempStream);



        tempStream.Seek(0, SeekOrigin.End);
        StreamWriter writer = new StreamWriter(tempStream);
        writer.WriteLine();
        writer.Flush();
        tempStream.Position = 0;


         StreamContent streamContent = new StreamContent(tempStream);
         foreach(var header in Request.Content.Headers)
         {
             streamContent.Headers.Add(header.Key, header.Value);
         }

        // Read the form data and return an async task.
         await streamContent.ReadAsMultipartAsync(provider);

希望这可以帮助。

于 2013-06-25T06:55:53.187 回答
10

阅读您现有的研究并跟踪报告的 codeplex 问题,看起来其他人确认此问题在 9 月仍然存在。

他们认为 MVC 4 无法在没有终止“\r\n”的情况下解析上传。

这个问题真的很简单,但很难解决。问题是 Uploadify 没有在 MultiPartForm 消息的末尾添加“\r\n”

http://aspnetwebstack.codeplex.com/discussions/354215

值得检查一下 Flex 上传是否添加了“\r\n”

于 2012-12-08T14:42:54.227 回答
10

对于那些登陆这里谷歌搜索的人:

MIME 多部分流的意外结束。MIME 多部分消息不完整。

多次读取请求流也会导致此异常。我挣扎了好几个小时,直到找到一个解释请求流只能读取一次的来源。

就我而言,我结合尝试使用 a 读取请求流MultipartMemoryStreamProvider,同时让 ASP.NET 通过为我的 api 方法指定参数(来自请求正文)为我做一些魔术。

于 2017-02-15T17:27:11.157 回答
4

确保首先上传图像文件的虚拟目录(“~/App_Data”目录,如下例)是物理存在的。发布项目时,它可能不在输出文件中。

string root = HttpContext.Current.Server.MapPath("~/App_Data");
var provider = new MultipartFormDataStreamProvider(root);
于 2017-05-02T14:44:08.460 回答
1

我刚刚删除了我在 post 方法上设置的标题,最终解决了这个问题。

于 2018-05-21T07:39:46.190 回答
1

问题是这一行:

string root = HttpContext.Current.Server.MapPath("~/App_Data");

它只能在 localhost 中工作,您可以在 System.Web 对象(如 HttpContext.Current)不可用的任何上下文中使用 HostingEnvironment.MapPath 代替(例如,也来自静态方法)。

var mappedPath = System.Web.Hosting.HostingEnvironment.MapPath("~/SomePath");

另请参阅Server.MapPath 和 HostingEnvironment.MapPath 有什么区别?

参考这个答案How to do a Server Map Path。

于 2019-05-16T14:42:06.103 回答