Как создать архивный поток из IFormFileCollection - PullRequest
1 голос
/ 22 января 2020

Я получаю IFormFileCollection, и мне было интересно, как я могу заархивировать эту коллекцию в файл zip/rar/whatever archive и отправить этот архив как stream в другое место для хранения? Я хочу работать только в памяти через Stream (s), поскольку позже я отправлю его по HTTP.

class ArchiveService {
    public Stream ArchiveFiles(string archiveName, IEnumerable<IFormFile> files) {
        using MemoryStream stream = new MemoryStream();
        using (System.IO.Compression.ZipArchive archive = ZipFile.Open([in memory!], ZipArchiveMode.Create)) {
            foreach (var file in files) {
                archive.CreateEntry(file.FileName, CompressionLevel.Fastest);
            }
           //something like -> archive.CopyTo(stream);
        }
        return stream;

    }
}

1 Ответ

1 голос
/ 22 января 2020

Создайте архив в памяти и просмотрите коллекцию, добавив файлы в архив.

Возвращенный поток будет содержать файлы, сжатые в архив.

Затем вы можете делать так, как вы wi sh с потоком

public class ArchiveService {
    public Stream ArchiveFiles(IEnumerable<IFormFile> files) {
        MemoryStream stream = new MemoryStream();
        using (ZipArchive archive = new ZipArchive(stream, ZipArchiveMode.Create, leaveOpen: true)) {
            foreach (IFormFile file in files) {
                var entry = archive.CreateEntry(file.FileName, CompressionLevel.Fastest);
                using (Stream target = entry.Open()) {
                    file.CopyTo(target);
                }
            }
        }
        stream.Position = 0;
        return stream;
    }

    public async Task<Stream> ArchiveFilesAsync(IEnumerable<IFormFile> files) {
        MemoryStream stream = new MemoryStream();
        using (ZipArchive archive = new ZipArchive(stream, ZipArchiveMode.Create, leaveOpen: true)) {
            foreach (IFormFile file in files) {
                var entry = archive.CreateEntry(file.FileName, CompressionLevel.Fastest);
                using (Stream target = entry.Open()) {
                    await file.OpenReadStream().CopyToAsync(target);
                }
            }
        }
        stream.Position = 0;
        return stream;
    }
}
...