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
。