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

Asp.net mvc ASP.NET Web API,从Flex FileReference上载时MIME多部分流意外结束,asp.net-mvc,apache-flex,asp.net-web-api,Asp.net Mvc,Apache Flex,Asp.net Web Api,按照ASP.NET上的教程,实现了一个Web API控制器方法,用于执行异步文件上载,如下所示: public Task<HttpResponseMessage> PostFormData() { // Check if the request contains multipart/form-data. if (!Request.Content.IsMimeMultipartContent()) { throw new HttpResponse

按照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;
}
公共任务PostFormData()
{
//检查请求是否包含多部分/表单数据。
如果(!Request.Content.IsMimeMultipartContent())
{
抛出新的HttpResponseException(HttpStatusCode.UnsupportedMediaType);
}
string root=HttpContext.Current.Server.MapPath(“~/App_Data”);
var provider=新的MultipartFormDataStreamProvider(根);
//读取表单数据并返回异步任务。
var task=Request.Content.ReadAsMultipartAsync(提供程序)。
继续(t=>
{
如果(t.IsFaulted | | t.IsCanceled)
{
Request.CreateErrorResponse(HttpStatusCode.InternalServerError,t.Exception);
}
返回Request.CreateResponse(HttpStatusCode.OK);
});
返回任务;
}
通过标准的多部分HTML表单上传文件非常有效。但是,当另一个开发人员试图通过Flex的FileReference类构造的多部分表单上载文件时,会抛出一个错误:

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


我不知道问题是出在WebAPI还是Flex上。我发现了一些没有影响()的相关修复,最近发现了这个()。如果第二个链接为真,有人知道它是否出现在通过Nuget提供的Web API的当前版本中吗?讨论是在5月份,Nuget的最新版本是8月份,因此我假设此修复程序已经部署,并且不是我问题的根本原因。

阅读您现有的研究并关注codeplex问题,报告说似乎有人在9月份确认此问题仍然存在

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

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


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

我对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);

希望这能有所帮助。

我对MVC4也有同样的问题,但威尔是正确的,请在输入中添加一个名称

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


所有的魔法都恢复了并开始发挥作用

对于在谷歌上登陆的用户:

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

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


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

确保虚拟目录(“~/App\u Data”目录,如下例所示)首先上载图像文件的位置是物理存在的位置。发布项目时,它可能不在输出文件中

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

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

问题是这行:

string root = HttpContext.Current.Server.MapPath("~/App_Data");
它只在localhost中工作,您可以在System.Web对象(如HttpContext.Current)不可用的任何上下文中使用HostingEnvironment.MapPath(例如,也可以从静态方法)

另见


参考此答案

不确定Flex(是否有其他类型的上传?),但Flash的FileReference.upload()没有添加它。我想这就是为什么Uploadify没有添加它的原因,因为他们不能真正改变默认行为。在这里放置占位符,直到其中一个被删除的答案被取消删除。我也遇到了同样的问题,解决方法很简单——在file upload元素中添加一个名称<代码>。白痴。没有名字的输入是不会发布的。谢谢你花时间发布这个我到目前为止看到的唯一的解决方法,用于Flash帖子。如果它生成一个虚拟流来检测内部流的结尾并附加一个CRLF,则效率会更高。如果文件很大,这会很容易爆炸。谢谢!这对我来说确实有效(AdobeAirMobile上传到WebApi 2.0)。这比一些疯狂的建议要简单得多。我已经实现了这一点,但仍然得到了错误。还有什么想法吗?@TheDumbRadish如果您添加了此代码后仍然存在相同的问题,那么您的流可能不在开始。在第一行代码后添加此项:
reqStream.Position=0就这么简单。谢谢你找到解决这个问题的办法了吗?有解决办法吗?@TobiasMoeThorstensen唯一可用的解决办法是只读取一次流(这不是真正的解决办法)。您可以只使用MultiPartMemoryStreamProvider,也可以使用[FromBody]为您提供WebApi提取/解析值。我们的解决方案最终完全依赖MultiPartMemoryStreamProvider,因为它更适合我们想要实现的目标。谢谢@尼克拉斯克兰德尔
var mappedPath = System.Web.Hosting.HostingEnvironment.MapPath("~/SomePath");