上传zip文件时Windows Azure出错:“ZipException未处理”“标题中的EOF”

时间:2010-03-30 18:08:06

标签: azure azure-blob-storage

我一直在使用Windows Azure来创建文档管理系统,到目前为止情况还不错。我已经能够通过asp.net前端上传和下载文件到BLOB存储。

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

我正在使用ICSharpCode.SharpZipLib库,我已将其用于许多其他任务,并且它工作得很好。

以下是基本代码:

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

并且它在我得到错误时开始的那一行。我增加了10秒的睡眠持续时间,以确保有足够的时间。

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

2 个答案:

答案 0 :(得分:2)

只是一个随机的猜测,但是你需要在阅读之前将流回到0吗?不确定你是否已经这样做(或者如果有必要的话)。

答案 1 :(得分: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();