.net core создает в памяти zipfile - PullRequest
0 голосов
/ 19 ноября 2018

Я работаю над проектом MVC, в котором я динамически создаю pdf-файлы (wkhtmltopdf), которые я хочу вернуть в виде zip-файла. PDF-файлы создаются на лету - мне не нужно их хранить, поэтому мой код для возврата одного файла:

File(pdfBytes, "application/pdf", "file_name")

Взглянув на Документы Microsoft , их пример просматривает сохраненные файлы:

 string startPath = @"c:\example\start";
 string zipPath = @"c:\example\result.zip";
 string extractPath = @"c:\example\extract";

 ZipFile.CreateFromDirectory(startPath, zipPath);
 ZipFile.ExtractToDirectory(zipPath, extractPath);

В моем случае я хочу создать N pdf файлов и вернуть их в виде zip-файла .. Что-то вроде:

ZipFile zip = new ZipFile();
foreach(var html in foundRawHTML)
{
//create pdf

//append pdf to zip
}

return zip;

Хотя это не выполнимо, потому что:

  1. ZipFile и File являются статическими и не могут быть установлены
  2. Нет способа добавить файл в zip-файл на лету (в памяти)

Любая помощь приветствуется

1 Ответ

0 голосов
/ 19 ноября 2018

Вы можете использовать в памяти байтовые массивы и ZipArchive из System.IO.Compression, нет необходимости сопоставлять локальный диск:

    public static byte[] GetZipArchive(List<InMemoryFile> files)
        {
            byte[] archiveFile;
            using (var archiveStream = new MemoryStream())
            {
                using (var archive = new ZipArchive(archiveStream, ZipArchiveMode.Create, true))
                {
                    foreach (var file in files)
                    {
                        var zipArchiveEntry = archive.CreateEntry(file.FileName, CompressionLevel.Fastest);
                        using (var zipStream = zipArchiveEntry.Open())
                            zipStream.Write(file.Content, 0, file.Content.Length);
                    }
                }

                archiveFile = archiveStream.ToArray();
            }

            return archiveFile;
        }

public class InMemoryFile
    {
        public string FileName { get; set; }
        public byte[] Content { get; set; }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...