【问题标题】:How to extract zipped file received from HttpWebResponse?如何提取从 HttpWebResponse 收到的压缩文件?
【发布时间】:2012-09-10 11:23:38
【问题描述】:

我将url 放到浏览器的地址栏,然后它将压缩文件下载为高清格式。压缩文件的大小在其属性中是 386 字节。

当我使用UnZipFiles 方法提取文件时 - 它可以工作。 但是,我想以编程方式下载并将其提取到内存中。我使用GetResultFromServer 方法来获取压缩内容。如标题所示,内容的大小与保存在 HD 上的压缩文件大小相同:

content-disposition: attachment; filename=emaillog-xml.zip
Content-Length: 386
Cache-Control: private
Content-Type: application/zip
Date: Mon, 10 Sep 2012 08:28:28 GMT
Server: Microsoft-IIS/7.5
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET

我的问题是如何提取GetResultFromServer返回的内容? 我尝试了以下方法:

var ms = new MemoryStream(Encoding.Unicode.GetBytes(res))
var s = new ZipInputStream(ms);

但我得到Unable to read from this stream

更新

我尝试了var zipStream = new System.IO.Compression.GZipStream(response.GetResponseStream(), CompressionMode.Decompress),但我收到The magic number in GZip header is not correct 错误

代码

private string GetResultFromServer(ElasticLogParams elasticLogParams)
{        
    var webRequest = (HttpWebRequest)WebRequest.Create(url);            
    var response = webRequest.GetResponse();

    using (var reader = new StreamReader(response.GetResponseStream()))
    {
        var res = reader.ReadToEnd();
        var headers = response.Headers.ToString();              

        return res;
    }
}

public static void UnZipFiles(string zippedFilePath, Stream stream = null)
{
    var s = new ZipInputStream(stream ?? File.OpenRead(zippedFilePath));

    ZipEntry theEntry;
    while ((theEntry = s.GetNextEntry()) != null)
    {
        using (var streamWriter = File.Create(@"D:\extractedXML.xml"))
        {
            var size = 2048;
            var data = new byte[size];
            while (true)
            {
                size = s.Read(data, 0, size);
                if (size > 0)
                {
                    streamWriter.Write(data, 0, size);
                }
                else
                {
                    break;
                }
            }
            streamWriter.Close();
        }
    }
    s.Close();
}

【问题讨论】:

  • 你试过var s = new ZipInputStream(response.GetResponseStream());吗?
  • @Rowland,它没有用。也许我需要使用System.IO.Compression.GZipStream
  • 我试过 var zipStream = new System.IO.Compression.GZipStream(response.GetResponseStream(), CompressionMode.Decompress) 但我得到 The magic number in GZip header is not correct 错误
  • @Rowland Shaw,我不知道为什么它第一次不起作用,但现在它起作用了。我在迈克的回答中给了你荣誉

标签: c# httpwebrequest zip gzip


【解决方案1】:

试一试:

var response = webRequest.GetResponse() as HttpWebResponse;
var stream = response.GetResponseStream();
var s = new ZipInputStream(stream);

我相信你非常接近并且你使用了正确的方法——你可以使用this article 来支持它——他们的代码非常相似。

【讨论】:

  • 我试过 var chars = new char[response.ContentLength]; reader.Read(chars, 0, (int)response.ContentLength); var bytes = Encoding.ASCII .GetBytes(chars); var ms = new MemoryStream(bytes); UnZipFiles(null, ms); 但我得到 Unknown block type 7 错误
  • 如果我尝试var bytes = Encoding.UTF8.GetBytes(chars);,返回字节的大小是 621 而不是 386
  • 如果您按原样运行我提供的示例会发生什么?将byte[] 直接发送到MemoryStream,然后将MemoryStream 发送到ZipInputStream 时,是否出现错误?
  • response 没有Read 方法,因此我使用reader
  • 哦,我认为问题在于您只需要将响应转换为HttpWebResponse
【解决方案2】:

我正在使用http://dotnetzip.codeplex.com/ 我没有用它来下载东西,而是提取人们上传到我服务器的东西。我认为它也应该反过来完美地工作。

我也试过微软的内置 zip,但也有问题。所以我放弃了它并切换了。

【讨论】:

  • 但您需要先将文件保存在 HD 上。而且我不想将其保存为高清,而是通过HttpWebResponse下载后立即提取
猜你喜欢
  • 1970-01-01
  • 2012-12-09
  • 1970-01-01
  • 2017-07-17
  • 1970-01-01
  • 2012-06-10
  • 1970-01-01
  • 2017-02-13
  • 1970-01-01
相关资源
最近更新 更多