Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何提取从HttpWebResponse收到的压缩文件?_C#_Httpwebrequest_Zip_Gzip - Fatal编程技术网

C# 如何提取从HttpWebResponse收到的压缩文件?

C# 如何提取从HttpWebResponse收到的压缩文件?,c#,httpwebrequest,zip,gzip,C#,Httpwebrequest,Zip,Gzip,我将url放在浏览器的地址栏上,它会将zip文件下载到HD。压缩文件的大小为386字节,写入其属性中 当我使用UnZipFiles方法提取文件时,它可以工作。 但是,我想通过程序下载并在内存中提取它。我使用GetResultFromServer方法获取压缩内容。如标题所示,内容的大小与硬盘上保存的压缩文件的大小相同: content-disposition: attachment; filename=emaillog-xml.zip Content-Length: 386 Cache-Contr

我将
url
放在浏览器的地址栏上,它会将zip文件下载到HD。压缩文件的大小为386字节,写入其属性中

当我使用
UnZipFiles
方法提取文件时,它可以工作。 但是,我想通过程序下载并在内存中提取它。我使用
GetResultFromServer
方法获取压缩内容。如标题所示,内容的大小与硬盘上保存的压缩文件的大小相同:

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);
但是我无法从这个流读取

已更新


我尝试了
var zipStream=new System.IO.Compression.GZipStream(response.GetResponseStream(),CompressionMode.decompresse)
但我得到了
GZip头中的幻数不正确
错误

代码

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();
}
我正在使用 我没有用它来下载东西,而是提取人们上传到我服务器上的东西。我想反过来也会很好地工作

我也尝试过微软的内置zip,但也有问题。所以我放弃了它,换了个方向。

试试看:

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

我相信您已经非常接近了,并且您使用了正确的方法--您可以使用它来备份--他们的代码非常相似。

您是否尝试过
var s=new ZipInputStream(response.GetResponseStream())?@Rowland,它不起作用。也许我需要使用
System.IO.Compression.GZipStream
?我尝试了
var zipStream=new System.IO.Compression.GZipStream(response.GetResponseStream(),CompressionMode.decompression)
,但我得到的
GZip头中的幻数不正确
error@RowlandShaw我不知道为什么第一次没用,但现在它起作用了。我相信迈克的回答,但你需要先把文件保存在高清上。我不想把它保存在HD上,但只要我通过
HttpWebResponse
下载,我就会尝试
var chars=new char[response.ContentLength];reader.Read(chars,0,(int)response.ContentLength);var bytes=Encoding.ASCII.GetBytes(字符);var ms=新内存流(字节);UnZipFiles(null,ms)
但是如果我尝试
var bytes=Encoding.UTF8.GetBytes(chars),我会得到
未知块类型7
error返回字节的大小是621而不是386如果按原样运行我提供的示例会发生什么?当您将
字节[]
直接发送到
内存流中,然后将
内存流
发送到
ZipInputStream中时,是否会出错?
响应
没有
读取
方法,因此我使用
读取
哦,我认为问题在于,您只需要将repsonse转换为
HttpWebResponse