我将url
放到浏览器的地址栏中,然后将zip文件下载到HD。压缩文件的大小为386字节,如其属性所示。
当我使用UnZipFiles
方法提取文件时 - 它可以工作。
但是,我想下载programaticaly并将其提取到内存中。我使用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();
}
答案 0 :(得分:3)
试一试:
var response = webRequest.GetResponse() as HttpWebResponse;
var stream = response.GetResponseStream();
var s = new ZipInputStream(stream);
我相信你非常接近并且你正在使用正确的方法 - 你可以使用this article来支持它 - 他们的代码非常相似。
答案 1 :(得分:0)
我正在使用http://dotnetzip.codeplex.com/ 我没有用它来下载东西,而是用它来提取人们上传到我服务器的东西。我认为它也应该完全相反。
我也尝试过微软的内置拉链,但也有问题。所以我把它放弃并换了。