Ошибка в Windows Azure при загрузке zip-файла:“Исключение ZipException было необработанным” “EOF в заголовке”
-
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();