Сжать файл с помощью dotnetzip, и при открытии он поврежден

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

byte[] fileBytes =array
MemoryStream fileStream = new MemoryStream(fileBytes);
MemoryStream outputStream = new MemoryStream();
fileStream.Seek(0, SeekOrigin.Begin);

using (ZipFile zipFile = new ZipFile())
{
    zipFile.AddEntry(returnFileName, fileStream);
    zipFile.Save(outputStream);
}

outputStream.Position = 0;

FileStreamResult fileResult = new FileStreamResult(outputStream, System.Net.Mime.MediaTypeNames.Application.Zip);
fileResult.FileDownloadName = returnFileName + ".zip";

return fileResult;

person user1957868    schedule 08.01.2013    source источник
comment
Загруженный файл содержит что-нибудь?   -  person mortb    schedule 08.01.2013
comment
да, содержит файл, но при открытии он поврежден   -  person user1957868    schedule 08.01.2013
comment
файл представляет собой файл xml, и когда я его открываю, я получаю что-то вроде: K!‡Vá2Ž™[Content_Types].xml ¢( ¼•MOÂ@†ï&þ‡f¯†.bŒ¡xðã¨$bâuítÃ~eg@ø÷n·XA!^ºi;ó¾ÏÎt§ƒë¥ÑÙ*gÖË»,[:©ì´ãûÎ%Ë„•B;[²ëáéÉ. Вместо исходного файла xmlf   -  person user1957868    schedule 09.01.2013
comment
Разве это не должен быть zip-файл, когда вы его открываете? Он должен начинаться с букв PK, если вы откроете его в блокноте. После ПК должен быть нечитаемый бред (который можно прочитать при распаковке). Буквы PK будут указывать на то, что это zip-файл.   -  person mortb    schedule 09.01.2013
comment
...и где код, где вы помещаете xml-файл в массив байтов? Это также может быть место, где что-то идет не так? Пожалуйста, включите это в свой вопрос.   -  person mortb    schedule 09.01.2013
comment
Это zip-файл, я имею в виду, что я открываю его в блокноте и имею pk. И я могу разархивировать файл, правильно. Но содержимое разархивированного файла выглядит как то, что я поместил выше, вместо исходного файла xml. выглядит после разархивирования (я делаю это с окнами), выглядит как оригинальный zip или что-то в этом роде.   -  person user1957868    schedule 09.01.2013
comment
ну я же говорю, что содержимое переменной fileBytes может быть неверным...   -  person mortb    schedule 09.01.2013
comment
содержимое файловых байтов правильное, потому что есть два варианта загрузки: сжатый файл или нет. И если я загружаю файл без сжатия, файл выглядит правильно. Я имею в виду другой вариант возврата: return File(fileBytes, text/html, returnFileName);. И это правильно, поэтому файловые байты в порядке   -  person user1957868    schedule 09.01.2013
comment
Я не знаю почему. Но когда я прочитал документацию, я нашел перегрузку для zipFile.AddEntry, которая будет принимать массив байтов (dotnetzip .herobo.com/DNZHelp/Index.html) Вместо этого я бы попробовал использовать эту перегрузку, тогда вам не придется беспокоиться о создании первого MemoryStream.   -  person mortb    schedule 09.01.2013
comment
да, это правда, но проблема та же   -  person user1957868    schedule 09.01.2013
comment
извините, я не знаю, почему вы получаете ошибку... :(   -  person mortb    schedule 09.01.2013


Ответы (2)


Возможно, вам не повезло столкнуться с одной из открытых ошибок в DotNetZip. Есть, например. проблема зависит от размера файла (https://dotnetzip.codeplex.com/workitem/14087 ).

К сожалению, у DotNetZip есть некоторые критические проблемы, и похоже, что проект больше не будет активно поддерживаться. Лучшей альтернативой будет использование SharpZipLib (если вы соблюдаете их лицензию на основе GPL) или один из .NET-портов zlib. .

Если вы используете .NET 4.5, вы можете использовать встроенные классы в System.IO.Compression. Следующий пример можно найти в документации по ZipArchive< /а> класс:

using System;
using System.IO;
using System.IO.Compression;

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var zipToOpen = 
                new FileStream(@"c:\tmp\release.zip", FileMode.Open))
            {
                using (var archive = 
                     new ZipArchive(zipToOpen, ZipArchiveMode.Update))
                {
                    var readmeEntry = archive.CreateEntry("Readme.txt");
                    using (var writer = new StreamWriter(readmeEntry.Open()))
                    {
                            writer.WriteLine("Information about this package.");
                            writer.WriteLine("========================");
                    }
                }
            }
        }
    }
}
person Dirk Vollmar    schedule 08.01.2013

person    schedule
comment
На этом пути создается файл, который я не хочу, и в любом случае результат поврежден. Вы пытались открыть файл после загрузки? И еще, мой возвращаемый тип должен быть FileStreamResult, потому что это контроллер, поэтому я должен сделать что-то вроде FileStreamResult fileResult = new FileStreamResult(fileResultStream, System.Net.Mime.MediaTypeNames.Application.Zip); - person user1957868; 09.01.2013
comment
Да, я могу открыть файл. Содержимое не повреждено. Я отредактировал свой ответ, включив в него код контроллера. - person shamp00; 09.01.2013
comment
fileBytes = Encoding.ASCII.GetBytes(abcdefghi); если я перезапишу файловые байты этим, я получу правильный результат. Но с моими файлами не работает. - person user1957868; 09.01.2013
comment
Тогда это должно быть связано с кодировкой вашего массива байтов. Можете ли вы преобразовать его в строку с Encoding.Convert(Encoding.GetEncoding("iso-8859-1"), Encoding.UTF8, bytes);? Строка выглядит правильно? - person shamp00; 09.01.2013
comment
Я пробовал это, но все еще выглядит неправильно, когда я открываю файл. - person user1957868; 11.01.2013
comment
Можете ли вы опубликовать пример XML-файла, включая код, который вы используете для его преобразования в массив байтов? - person shamp00; 14.01.2013