遵循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月份,所以我假设这个修复已经部署了,并不是我问题的根本原因。
7条答案
按热度按时间epfja78i1#
我在MVC4上也遇到了同样的问题,但Will是正确的,请在您的输入中添加一个名称.....
所有的魔力都回来了,而且正在发挥作用!
li9yvcax2#
Flex也有同样的问题。下面是解决这个问题的代码。基本上,我使用自定义流来附加ASP.NETWeb API所期望的换行符。
希望这能帮上忙。
v7pvogib3#
阅读您现有的研究,并跟踪到CodePlex问题报告,看起来其他人证实这个问题在9月份仍然存在。
他们认为MVC 4无法在没有终止“\r\n”的情况下解析上传。
这个问题真的很简单,但却很难解决。问题是Uploadify没有在MultiPartForm消息的末尾添加“\r\n”
http://aspnetwebstack.codeplex.com/discussions/354215
可能需要检查Flex上载是否添加了“\r\n”
pkbketx94#
对于那些登陆这里进行谷歌搜索的人来说:
MIME多部分流意外结束。MIME多部分消息不完整。
多次读取请求流也会导致此异常。我为此挣扎了几个小时,直到我找到一个来源,解释说请求流只能读取一次。
在我的例子中,我尝试使用
MultipartMemoryStreamProvider
读取请求流,同时让ASP.NET通过为我的API方法指定参数(来自请求正文)来为我变魔术。nwsw7zdq5#
确保首先上传镜像文件的虚拟目录(如下例所示的~/App_Data目录)物理存在。发布项目时,它可能不在输出文件中。
muk1a3rh6#
我只是删除了我在POST方法上设置的标题,这最终解决了这个问题。
xxslljrj7#
问题是这行字:
它只能在本地主机中工作,你可以在任何像HttpConext.Current这样的System.Web对象不可用的上下文中使用HostingEnvironment.MapPath(例如,也可以从静态方法)。
另请参阅What is the difference between Server.MapPath and HostingEnvironment.MapPath?
此答案的引用How to do a Server Map Path.