Ошибка в Windows Azure при загрузке zip-файла:“Исключение ZipException было необработанным” “EOF в заголовке”

StackOverflow https://stackoverflow.com/questions/2547481

  •  23-09-2019
  •  | 
  •  

Вопрос

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

Что я пытаюсь сделать сейчас, так это разрешить пользователям загружать zip-файл, а затем извлекать файлы из этого zip-файла и сохранять их как отдельные файлы.Проблема в том, что я получаю "ZipException было необработанным", "EOF в заголовке", и я не знаю почему.

Я использую ICSharpCode.Библиотеку SharpZipLib, которую я использовал для многих других задач, и она отлично работала.

Вот базовый код:

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

и именно в строке, которая начинается с while, я получаю сообщение об ошибке.Я добавил продолжительность сна в 10 секунд, просто чтобы убедиться, что прошло достаточно времени.

MemStream имеет длину, если я его отлаживаю, но zipInput иногда имеет, но не всегда.Это всегда терпит неудачу.

Это было полезно?

Решение

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

Другие советы

Подсказка @Smarx сработала и для меня.Ключом к тому, чтобы избежать пустых файлов внутри zip, является установка нулевой позиции.Для наглядности приведем пример кода, который отправляет zip-поток, содержащий большой двоичный объект 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();
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top