无法通过 HTTP 响应从文件下载创建 DotNetZip Zip文件

本文关键字:创建 文件下载 DotNetZip Zip 文件 响应 HTTP | 更新日期: 2023-09-27 18:35:31

我尝试通过URL下载zip文件以从中提取文件。 我宁愿不必将其保存为临时文件(工作正常),而是将其保存在内存中 - 它不是很大。 例如,如果我尝试下载此文件:

http://phs.googlecode.com/files/Download%20File%20Test.zip

使用此代码:

using Ionic.Zip;
...
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(URL);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
if (response.ContentLength > 0)
{
    using (MemoryStream zipms = new MemoryStream())
    {
        int bytesRead;
        byte[] buffer = new byte[32768];
        using (Stream stream = response.GetResponseStream())
        {
            while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0)
                zipms.Write(buffer, 0, bytesRead);
            ZipFile zip = ZipFile.Read(stream); // <--ERROR: "This stream does not support seek operations. "
        }
        using (ZipFile zip = ZipFile.Read(zipms)) // <--ERROR: "Could not read block - no data!  (position 0x00000000) "
        using (MemoryStream txtms = new MemoryStream())
        {
            ZipEntry csentry= zip["Download File Test.cs"];
            csentry.Extract(txtms);
            txtms.Position = 0;
            using (StreamReader reader = new StreamReader(txtms))
            {
                string csentry = reader.ReadToEnd();
            }
        }
    }
}
...
请注意我在哪里

标记了我收到的错误。 对于第一个,它不喜欢System.Net.ConnectStream。 如果我注释掉该行并允许它到达我注意到第二个错误的行,它不喜欢 MemoryStream。 我确实看到了这个帖子:https://stackoverflow.com/a/6377099/1324284 但我遇到了其他人提到的关于读取方法重载不超过 4 个的问题,所以我无法尝试 WebClient。

但是,如果我通过FileStream执行所有操作并首先将其保存到临时位置,然后将ZipFile.Read指向该临时位置,则一切正常,包括将任何包含的文件提取到MemoryStream中。

感谢您的任何帮助。

无法通过 HTTP 响应从文件下载创建 DotNetZip Zip文件

读取之前,您需要Flush() MemoryStream并将Position设置为 0,否则您将尝试从当前位置读取(那里什么都没有)。

对于您的代码:

ZipFile zip;
using (Stream stream = response.GetResponseStream())
{
    while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0)
        zipms.Write(buffer, 0, bytesRead);
    zipms.Flush();
    zipms.Position = 0;
    zip = ZipFile.Read(zipms);
}