2015-09-23 2 views
3

Я использую ZipArchive с обработчиком, чтобы служить пользователю, использующему поток памяти и веб-обработчик. Локально это работало, пока я не загрузил приложение на сайт.ZipArchive обслуживает недопустимый файл на реальном сервере

Вот мой код.

using (ZipArchive newArchive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true)) 
{ 
    newArchive.CreateEntryFromFile(fileName, Path.GetFileName(fileName)); 
    if (File.Exists(acRefFile)) 
    { 
     newArchive.CreateEntryFromFile(acRefFile, 
      newACRefName + Path.GetExtension(acRefFile)); 
    } 
    else 
    { 
     SystemLogManager sysLogMgr = new SystemLogManager(); 
     sysLogMgr.AddErrorMessage(acRefFile, "File not found"); 
    } 
    if (File.Exists(exRefFile)) 
    { 
     newArchive.CreateEntryFromFile(exRefFile, 
      newExRefName + Path.GetExtension(exRefFile)); 
    } 
    else 
    { 
     SystemLogManager sysLogMgr = new SystemLogManager(); 
     sysLogMgr.AddErrorMessage(exRefFile, "File Not Found"); 
    } 
    if (File.Exists(exRef2File)) 
    { 
     newArchive.CreateEntryFromFile(exRef2File, 
      newExRef2Name + Path.GetExtension(exRef2File)); 
    } 
} 
memoryStream.Position = 0; 
byte[] bytes = memoryStream.GetBuffer(); 
context.Response.Buffer = true; 
context.Response.Clear(); 
context.Response.ContentType = "application/zip"; 
context.Response.AddHeader("content-disposition", 
    string.Format("attachment; filename =app_{0}_{1}.zip", appForm.Cand_sno, 
     appForm.App_year)); 
context.Response.BinaryWrite(bytes.ToArray()); 
context.Response.Flush(); 

На следующем изображении показан загруженный zip-файл и возникшая ошибка. Zip error

Так что-нибудь в коде, которое может быть неправильным или что-то, что я мог бы попробовать на стороне сервера?

Обновление 1: Основываясь на полученных комментариях, я попытался добавить zip-файл непосредственно на сервер. Такая же проблема возникает, так как в zip «поврежден».

Обновление 2: Дальнейшие исследования Теперь я обнаружил, что zip-файл открывается при использовании 7zip, но не стандартного экстракта Windows. Когда щелкните правой кнопкой мыши, выведите все сообщения о том, что почтовый адрес пуст.

Благодаря

+0

Является ли ваша машина разработки и сервер машиной на базе Windows? Вы проверили журналы событий/приложений сервера? –

+0

Оба разработчика и сервер - это окна, основанные на правильной версии .net. Я просмотрел журналы приложений, и примечание выделяется как возможная причина. – Dashwall

+0

Разве это «испорчено» каждый раз или 9 раз из 10? –

ответ

3

Так исправить на этот вопрос просто изменить byte[] bytes = MemoryStream.GetBuffer(); к byte[] bytes = MemoryStream.ToArray(); Что это делает это получить только используемые байты не дополнительные байты буфера добавляет.

+0

. Это исправлено моя проблема. result.Content = new ByteArrayContent (memoryStream.ToArray()); –

0

Я использую класс ZipFile и результат никогда не поврежден. Можете ли вы попробовать это?

ZipFile.CreateFromDirectory("C:\somefolder", "C:\someotherfolder\somefile.zip"); 
+0

ZipFile выглядит так, как будто он создает zip-файл непосредственно из содержимого каталогов. Я не создаю zip-файл, созданный при использовании группы определенных файлов из разных мест. – Dashwall

+0

Это правильно, но если ZipFile работает правильно, вы можете создать метод, который 1) Копирует все файлы во временный каталог. 2) Замещает каталог во временный zip-файл. 3) Удаляет временный каталог. 4) Возвращает zip-файл. –

Смежные вопросы