我有一个zip
文件,我可以从文件系统中使用DotNetZipLib读取。但是,当我通过form
将其发布到我的MVC应用程序时,它不能作为流读取。我目前最好的猜测是,HTTP上传会以某种方式破坏zip
文件。有同样问题的问题并不缺,我认为我已经正确地考虑了流,但也许我没有按照预期使用.NET对象。
这是我的WebAPI POST处理程序:
public void Post(HttpRequestMessage request)
{
using(var fileData = request.Content.ReadAsStreamAsync().Result)
if (fileData.Length > 0)
{
var zip = ZipFile.Read(fileData); // exception
}
}
当然,例外情况来自DotNetZipLib ZipFile
,只是说该流不能被视为zip
。如果我只用一个文件路径替换fileData
(这是在同一台机器上测试),那么它就会读取它,所以它必须是HTTP上传。
在FireBug中,POST的标题是:
Response Headers:
Cache-Control no-cache
Content-Length 1100
Content-Type application/xml; charset=utf-8
Date Sat, 01 Feb 2014 23:18:32 GMT
Expires -1
Pragma no-cache
Server Microsoft-IIS/8.0
X-AspNet-Version 4.0.30319
X-Powered-By ASP.NET
X-SourceFiles =?UTF-8?B?QzpcRGF0YVxDb2RlXE9yZ1BvcnRhbFxPcmdQb3J0YWxTZXJ2ZXJcYXBpXGFwcHg=?=
Request Headers
Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding gzip, deflate
Accept-Language en-US,en;q=0.5
Connection keep-alive
Cookie uvts=ENGUn8FXEnEQFeS
Host localhost:48257
Referer http://localhost:48257/Home/Test
User-Agent Mozilla/5.0 (Windows NT 6.3; WOW64; rv:26.0) Gecko/20100101 Firefox/26.0
Request Headers From Upload Stream
Content-Length 31817
Content-Type multipart/form-data; boundary=---------------------------265001916915724
form
很简单:
<form action="/api/appx" method="post" enctype="multipart/form-data">
<input name="postedFile" type="file" />
<input type="submit" />
</form>
我在蒸汽上做错了吗?从HttpRequestMessage
错误地提取数据?或许我应该以完全不同的方式接收上传?
答案 0 :(得分:1)
使用HTML表单发布文件时,媒体类型为multipart/form-data
,其中包含一些特殊的格式设置语法,您可以从Firebug详细信息中看到。您不能只将其作为流读取,并期望它与发送的文件匹配。有一组用于处理此媒体类型的ReadAsMultipartAsync
扩展方法。
答案 1 :(得分:0)
以下代码适用于Zip和Text文件。你可以尝试一下
public HttpStatusCode Post(string fileName)
{
var task = this.Request.Content.ReadAsStreamAsync();
task.Wait();
Stream requestStream = task.Result;
try
{
Stream fileStream = File.Create(HttpContext.Current.Server.MapPath("~/" + fileName));
requestStream.CopyTo(fileStream);
fileStream.Close();
requestStream.Close();
}
catch (IOException)
{
throw new HttpResponseException(HttpStatusCode.InternalServerError);
}
HttpResponseMessage response = new HttpResponseMessage();
response.StatusCode = HttpStatusCode.Created;
return response.StatusCode;
}