Ошибка в Windows Azure при загрузке zip-файла: «Исключение ZipException», «EOF в заголовке» - PullRequest
3 голосов
/ 30 марта 2010

Я использовал Windows Azure для создания системы управления документами, и до сих пор дела шли хорошо. Я был в состоянии загрузить и загрузить файлы в хранилище больших двоичных объектов через интерфейс asp.net.

Сейчас я пытаюсь разрешить пользователям загружать ZIP-файл, а затем извлекать файлы из этого ZIP-файла и сохранять их как отдельные файлы. Проблема в том, что я получаю "ZipException is 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 иногда, но не всегда. Это всегда терпит неудачу.

Ответы [ 2 ]

2 голосов
/ 31 марта 2010

Просто случайное предположение, но нужно ли искать поток обратно в 0, прежде чем читать его? Не уверен, что вы уже делаете это (или если это необходимо).

0 голосов
/ 18 апреля 2012

@ Смарт-намек тоже помог мне. Ключом к тому, чтобы избежать пустых файлов внутри почтового индекса, является установка позиции на ноль. Для ясности вот пример кода, который отправляет zip-поток, содержащий BLOB-объект Azure, в браузер

        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();
...