上载zip文件时在Windows Azure中出错:“0”;ZipException未经处理&引用;标题中的EOF“;

上载zip文件时在Windows Azure中出错:“0”;ZipException未经处理&引用;标题中的EOF“;,azure,azure-blob-storage,Azure,Azure Blob Storage,我一直在使用WindowsAzure创建文档管理系统,到目前为止一切进展顺利。我已经能够通过asp.net前端上传和下载文件到BLOB存储 我现在试图做的是允许用户上传一个.zip文件,然后从该.zip文件中取出文件并将其保存为单个文件。问题是,我得到了“ZipException未处理”“标题中的EOF”,我不知道为什么 我正在使用ICSharpCode.SharpZipLib库,我在许多其他任务中使用过它,它工作得非常好 以下是基本代码: CloudBlob ZipFile = contain

我一直在使用WindowsAzure创建文档管理系统,到目前为止一切进展顺利。我已经能够通过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有时有,但并不总是。它总是失败。

只是一个随机猜测,但在读取流之前,是否需要将其搜索回0?我不确定你是否已经这样做了(或者是否有必要)。

@Smarx hint也帮了我。避免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();

我所做的是设置。位置=0,这就成功了。。。似乎是这样。我想你的答案可能也有同样的结果。我仍然很好奇为什么会这样,我觉得这不符合逻辑。不是所有的流都支持搜索。例如,您可以创建一个web请求,然后使用DownloadToStream()将位从Windows Azure存储传输到此web请求。最后,返回到开始是没有意义的(比特已经被发送了)。我认为,因为您不能总是从头开始查找,所以存储客户机库做了它唯一能做的一致的事情,那就是将流留在原处。我可以看到,但在其他使用的上下文中,它不符合逻辑。我已经习惯了downloadtostream(Response)中的downloadtostream函数,这很好用。但可能响应会自动重置位置。不知道至少它似乎起作用了。