ASP.NET Web API,从Flex FileReference上载时MIME多部分流意外结束

h6my8fg2  于 2022-09-21  发布在  .NET
关注(0)|答案(7)|浏览(172)

遵循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;
}

通过标准的多部分超文本标记语言表单上传文件效果很好。然而,当另一个开发人员试图通过Flex的FileReference类构造的多部分形式上传文件时,会抛出一个错误:

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

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

epfja78i

epfja78i1#

我在MVC4上也遇到了同样的问题,但Will是正确的,请在您的输入中添加一个名称.....

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

所有的魔力都回来了,而且正在发挥作用!

li9yvcax

li9yvcax2#

Flex也有同样的问题。下面是解决这个问题的代码。基本上,我使用自定义流来附加ASP.NETWeb 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);

希望这能帮上忙。

v7pvogib

v7pvogib3#

阅读您现有的研究,并跟踪到CodePlex问题报告,看起来其他人证实这个问题在9月份仍然存在。

他们认为MVC 4无法在没有终止“\r\n”的情况下解析上传。
这个问题真的很简单,但却很难解决。问题是Uploadify没有在MultiPartForm消息的末尾添加“\r\n”

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

可能需要检查Flex上载是否添加了“\r\n”

pkbketx9

pkbketx94#

对于那些登陆这里进行谷歌搜索的人来说:
MIME多部分流意外结束。MIME多部分消息不完整。

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

在我的例子中,我尝试使用MultipartMemoryStreamProvider读取请求流,同时让ASP.NET通过为我的API方法指定参数(来自请求正文)来为我变魔术。

nwsw7zdq

nwsw7zdq5#

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

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

muk1a3rh6#

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

xxslljrj

xxslljrj7#

问题是这行字:

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

它只能在本地主机中工作,你可以在任何像HttpConext.Current这样的System.Web对象不可用的上下文中使用HostingEnvironment.MapPath(例如,也可以从静态方法)。

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

另请参阅What is the difference between Server.MapPath and HostingEnvironment.MapPath?

此答案的引用How to do a Server Map Path.

相关问题