HTTP上传会破坏Zip文件?

时间:2014-02-01 23:32:36

标签: c# asp.net-mvc upload asp.net-web-api zip

我有一个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错误地提取数据?或许我应该以完全不同的方式接收上传?

2 个答案:

答案 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;

        }