Ошибка при создании Zip-файла с использованием DotNetZip: неожиданный конец архива - PullRequest
0 голосов
/ 27 февраля 2012

У меня есть метод, который архивирует один или несколько файлов с помощью DotNetZip, и он работает правильно.Сегодня я впервые получил сообщение об ошибке, и оно, похоже, связано с общим размером архива.Используя то же изображение размером 60 МБ, я бы добавил несколько дополнительных копий, протестировал, повторил.Он работал нормально до тех пор, пока не было добавлено около 10 изображений, затем, когда я открыл Zip-файл с помощью WinRar, я получил ошибку «Неожиданный конец архива».Тестируя таким образом, я полагаю, что я исключил проблему, связанную с моим кодом или файлами (поврежден или что-то в этом роде).В коде нет ошибок, только WinRar.Когда я открываю Zip-файл, отображается только один файл с размером «0».Таким образом, кажется, что достигнут некоторый предел размера, и он не позволяет создавать архив.Я просто не знаю, какой это предел.Вот мой код, если это поможет:

HttpContext.Current.Response.Clear();
HttpContext.Current.Response.ContentType = "application/zip";
HttpContext.Current.Response.AddHeader("content-disposition", "filename=" + "MyFileName" + DateTime.Now.ToString("MMddyyyy") + ".zip");

using (var zip = new Ionic.Zip.ZipFile())
{
    zip.MaxOutputSegmentSize = 819200; // I tried adding this and it did not fix the problem

    foreach (var file in files)
    {
        zip.AddFile(file.FileLocation, file.ZipFileDirectory).FileName = 
            (!string.IsNullOrEmpty(file.ZipFileDirectory) && (file.ZipFileDirectory != @"\")) ? 
                string.Format(@"{0}\{1}", file.ZipFileDirectory, file.FileName) : 
                file.FileName;
    }

    zip.Save(HttpContext.Current.Response.OutputStream);
}

Ответы [ 2 ]

3 голосов
/ 15 октября 2014

Принятый здесь ответ не решил для меня проблему, однако использование некоторых комментариев привело меня к правильному пути. Чтобы решить эту проблему, я просто добавил

HttpContext.Current.Response.End();

после того, как вся обработка была завершена (в моем случае, сразу после примерного блока кода, вне блока использования).

2 голосов
/ 27 февраля 2012

Вам нужно очистить поток после того, как вы закончите запись в него?

HttpContext.Current.Response.Flush();

РЕДАКТИРОВАТЬ:

Вызовите HttpContext.Current.ApplicationInstance.CompleteRequest ()

...