如何从 IFormFileCollection 创建存档流

How to create an archive stream from IFormFileCollection

我收到了一个 IFormFileCollection,我想知道如何将这个 collection 存档到一个 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;

    }
}

在内存中创建存档并遍历集合,将文件添加到存档中。

返回的流将包含压缩到存档中的文件。

然后您可以随心所欲地处理流

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;
    }
}