【问题标题】:Cannot create DotNetZip ZipFile from file download via HTTP Response无法通过 HTTP 响应从文件下载创建 DotNetZip ZipFile
【发布时间】:2013-10-16 11:33:34
【问题描述】:

我尝试通过 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 个 Read 方法重载,因此我无法尝试 WebClient。

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

感谢您的帮助。

【问题讨论】:

    标签: c# asp.net memorystream dotnetzip


    【解决方案1】:

    你需要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);
    }
    

    【讨论】:

    • 谢谢哈尔瓦德。抱歉,如果我不是更清楚,我将两行都放在那里以节省空间。如果我用错误注释掉第一个,它将继续进行,直到它到达带有错误的下一行。我之前确实尝试过位置重置,但它给出了“此流不支持查找操作”的错误。我按照您的建议尝试了冲洗,但不幸的是它没有任何区别。
    • @Ernie 我可能错过了你的观点,但你能试试上面的代码吗(我刚刚编辑它以明确我想要完成的工作)?只运行这段代码会出现什么错误?
    • 很抱歉给您带来了困惑。如果我把你上面的代码,一个错误发生在 zipms.Position = 0 说它不支持搜索。如果我删除您添加的 2 行加上它们下方带有 'zip=...' 的行,代码将继续正常运行。然后它会在我在原始帖子中引用的“使用(ZipFile zip = ZipFile.Read(zipms))”时出错。希望清除它。
    • @Ernie 这很奇怪。我创建了一个简单的测试项目,在设置zipms.Position = 0; 时不会崩溃。哦,好吧,对不起,我帮不上忙。祝你好运找到答案! (如果你这样做,请发布)
    • 感谢您的尝试。您正在运行什么版本的 DotNetZip?你是从他们的网站上下载的吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-21
    • 1970-01-01
    • 2021-01-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多