2010-03-30 3 views
3

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

То, что я пытаюсь сделать сейчас, это позволить пользователям загружать 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 иногда, но не всегда. Это всегда терпит неудачу.

Спасибо за любую помощь.

Dave

ответ

2

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

+0

То, что я сделал, было установлено .Position = 0, что сделало трюк ... похоже. Я думаю, что ваш поисковый ответ может иметь тот же результат. По-прежнему любопытно, почему это так, хотя, это не кажется мне логичным. – david

+0

Ну, не все потоки поддерживают поиск. Например, вы можете создать веб-запрос, а затем использовать DownloadToStream() для переноса битов из хранилища Windows Azure в этот веб-запрос. В конце этого, поиск назад к началу не имеет смысла (биты уже отправлены). Я думаю, потому что вы не всегда можете вернуться к началу, библиотека клиентского хранилища делает единственную согласованную вещь, которую он может сделать, которая оставляет поток там, где он есть. – smarx

+0

Я вижу это, но в контексте другого использует его нелогично. Я использовал функцию downloadtostream в DownloadtoStream (Response), и это отлично работает. Но, возможно, ответ автоматически сбрасывает позицию. Не знаю. по крайней мере, похоже, что он работает. – david

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(); 
Смежные вопросы