2016-04-20 5 views
1

У меня есть веб-службы, которые возвращают список файлов. Что-то вроде этого:Создать Zip-файл из списка <Byte[]> в памяти

public FileModel(){ 
    string FileName {get;set;} 
    byte[] FileStream {get;set;} 
    string FileType {get;set;} 
} 

Моя_служба вернется:

List<FileModel> files; 

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

Тем не менее, я не могу понять, как это сделать, поскольку .NET ZipArchive CreateFromDirectory требует, чтобы я предоставил директорию, в которой файл, который должен быть заархивирован. Но у меня нет каталога, у меня есть только этот список. Как я могу скрывать этот список в zip-папке.

+2

Что вы имеете в виду * Способ зип *? Все конструкторы класса [ZipArchive] (https://msdn.microsoft.com/en-us/library/system.io.compression.ziparchive (v = vs.110) .aspx) принимают 'Stream'. –

+0

'Я должен вернуть этот список в браузер,' Нет, вы можете вернуть имя файла, тип файла и размер файла в браузер. Когда пользователь на самом деле запрашивает конкретный файл, вы можете вернуть его сжатым .... – Eser

+0

@Eser, Нет, мне действительно нужно вернуть ZIP-папку файлов в браузер/пользователь. – Mark

ответ

2

Учитывая

public FileModel(){ 
    string FileName {get;set;} 
    byte[] FileStream {get;set;} 
    string FileType {get;set;} 
} 

Следующая была написана, чтобы создать почтовый файл

static class FileModelCompression { 

    public static Stream Compress(this IEnumerable<FileModel> files) { 
     if (files.Any()) { 
      var ms = new MemoryStream(); 
      var archive = new ZipArchive(ms, ZipArchiveMode.Create, false); 
      foreach (var file in files) { 
       var entry = archive.add(file); 
      } 
      ms.Position = 0; 
      return ms; 
     } 
     return null; 
    } 

    private static ZipArchiveEntry add(this ZipArchive archive, FileModel file) { 
     var entry = archive.CreateEntry(file.FileName, CompressionLevel.Fastest); 
     using (var stream = entry.Open()) { 
      stream.Write(file.FIleStream, 0, file.FIleStream.Length); 
      stream.Position = 0; 
      stream.Close(); 
     } 
     return entry; 
    } 
} 
+0

Если мы используем ваш код, мы можем создать этот файл и посмотреть файлы в zip, но: Когда мы пытаемся извлечь zip, у нас есть ошибка, жалующаяся на неожиданный конец архива. – ProblemAnswerQue

+0

@ProblemAnswerQue, создайте новый вопрос, четко документирующий проблемы (проблемы), встречающиеся в [mcve], и ​​то, что вы пробовали до сих пор, чтобы решить эту проблему. Посмотрите, поможет ли сообщество. Из краткого комментария, который вы указали выше, я не могу найти, поскольку для этой ошибки может быть множество причин. Вы даже можете ссылаться на этот вопрос/ответ как на источник кода, который вы пробовали. – Nkosi

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