2013-09-24 12 views
1

Я извлекаю объект из couchbase, где у одного из полей есть файл. Файл зашифрован, а затем закодирован в base64.Декомпрессия файла Zip из строки

Как я могу взять эту строку и распаковать ее обратно в исходный файл?

Тогда, если я использую ASP.MVC 4 - Как я могу отправить его обратно в браузер в качестве загружаемого файла?

Оригинальный файл создается в системе Linux и декодируется в системе Windows (C#).

ответ

0

Вы должны использовать Convert.FromBase64String, чтобы получить байты, затем распаковать, а затем использовать Controller.File, чтобы клиент загрузил файл. Для распаковки вам нужно открыть zip-файл, используя некоторую библиотеку ZIP. .NET 4.5 встроенный класс ZipArchive должен работать. Или вы можете использовать другую библиотеку, как SharpZipLib, так и DotNetZip поддержку чтения из потоков.

public ActionResult MyAction() 
{ 
    string base64String = // get from Linux system 
    byte[] zipBytes = Convert.FromBase64String(base64String); 
    using (var zipStream = new MemoryStream(zipBytes)) 
    using (var zipArchive = new ZipArchive(zipStream)) 
    { 
     var entry = zipArchive.Entries.Single(); 
     string mimeType = MimeMapping.GetMimeMapping(entry.Name); 
     using (var decompressedStream = entry.Open()) 
      return File(decompressedStream, mimeType); 
    } 
} 

Вам также потребуется тип MIME файла, вы можете использовать MimeMapping.GetMimeMapping, чтобы помочь вам получить, что для наиболее распространенных типов.

+0

Я понял, что .NET 4.5 включает в себя класс 'ZipArchive', который будет работать. Обновлен мой ответ, чтобы использовать это. Я не пробовал, поэтому вам может понадобиться переработать, как вы закончите чтение записи в 'byte []' или 'Stream'. –

+0

PERFECT! Очень полезно. – JohnMighty

0

Я использовал SharpZipLib успешно для этого типа задач в прошлом.

Для примера это очень близко к тому, что вам нужно сделать, чтобы посмотреть here.

В принципе, шаги должны быть что-то вроде этого:

  • Вы получаете сжатый ввод в виде строки из базы данных
  • создать MemoryStream и написать строку к нему
  • искать назад к начало потока памяти
  • использовать MemoryStream в качестве входа в SharpZipLib ZipFile класс
  • следуйте приведенному выше примеру, чтобы распаковать содержимое th е ZipFile

Update

Если строка содержит только заархивированные содержимое файла (не полный Zip-архив), то вы можете просто использовать GZipStream класс в .NET, чтобы распаковать содержание. Вы можете найти образец here. Но начальные шаги такие же, как и выше (получить строку из db, записать в поток памяти, поток памяти корма в качестве входа в GZipStream для распаковки).

+0

Спасибо - но он выглядит довольно устаревшим и без какой-либо документации:/ – JohnMighty

+0

@JohnMighty - нет, он не устарел. Он довольно широко используется, и, насколько образцы, взгляните на ссылку в моем обновленном ответе. –

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