3

我一直在使用 Windows Azure 创建一个文档管理系统,到目前为止一切顺利。我已经能够通过 asp.net 前端将文件上传和下载到 BLOB 存储。

我现在尝试做的是允许用户上传 .zip 文件,然后将文件从 .zip 中取出并将它们保存为单独的文件。问题是,我得到“ZipException was unhandled”“EOF in header”,我不知道为什么。

我正在使用 ICSharpCode.SharpZipLib 库,该库已用于许多其他任务,并且效果很好。

这是基本代码:

CloudBlob ZipFile = container.GetBlobReference(blobURI);
MemoryStream MemStream = new MemoryStream();
ZipFile.DownloadToStream(MemStream);
....
while ((theEntry = zipInput.GetNextEntry()) != null)

它就在我收到错误时开始的那一行。我添加了 10 秒的睡眠持续时间,以确保有足够的时间过去。

如果我调试 MemStream ,它有一个长度,但 zipInput 有时会,但并非总是如此。它总是失败。

4

2 回答 2

2

Just a random guess, but do you need to seek the stream back to 0 before you read it? Not sure if you're doing that already (or if it's necessary).

于 2010-03-30T21:01:22.460 回答
0

@Smarx 提示也对我有用。避免 zip 中出现空文件的关键是将位置设置为零。为清楚起见,此处提供了将包含 Azure blob 的 zip 流发送到浏览器的示例代码。

        var fs1 = new MemoryStream();
        Container.GetBlobReference(blobUri).DownloadToStream(fs1);
        fs1.Position = 0;

        var outputMemStream = new MemoryStream();
        var zipStream = new ZipOutputStream(outputMemStream);

        var entry1 = new ZipEntry(fileName);
        zipStream.PutNextEntry(entry1);
        StreamUtils.Copy(fs1, zipStream, new byte[4096]);
        zipStream.CloseEntry();

        zipStream.IsStreamOwner = false;    // False stops the Close also Closing the underlying stream.
        zipStream.Close();                  // Must finish the ZipOutputStream before using outputMemStream.

        outputMemStream.Position = 0;

        Response.Clear();
        Response.AddHeader("Content-Disposition", "attachment;filename=" + zipFileName);
        Response.OutputStream.Write(outputMemStream.ToArray(), 0, outputMemStream.ToArray().Length);
        Response.End();
于 2012-04-17T23:40:10.710 回答