【发布时间】:2022-10-18 20:40:55
【问题描述】:
我有一个目录,里面有几个文件,我想根据请求发送给客户。为了做到这一点,我必须以某种方式将文件组合在一个文件中,但我不想将此文件(即使是暂时的)存储在文件系统中或完全存储在内存中。换句话说,我需要创建一个存档并将其直接流式传输到客户端。
一个简单的候选者似乎是一个 tarball。如果我理解正确,tarball 不包含全局文件头,而只是存档中各个文件的头:
HeaderFile1-File1-glue-HeaderFile2-File2-finalizer
假设这是正确的,则可以生成一个 tarball,而不必将其完全存储在内存中或其他地方,但我已经研究了 SharpCompress 和 SharpZipLib 库,但似乎都不支持这样的东西。
在我尝试完全自己实施之前,有两个问题:
-
有没有更简单的方法将目录内容流式传输到客户端。
-
是否有任何常用的库支持像我描述的那样流式传输 tarball?
仅供参考,我正在使用 ASP.net core 6
作为使用 SharpCompress 的示例,它首先将 tarball 完全加载到内存中:
DirectoryInfo directoryOfFilesToBeTarred = new DirectoryInfo(dir); FileInfo[] filesInDirectory = directoryOfFilesToBeTarred.GetFiles(); MemoryStream memStream = new MemoryStream(); var options = new TarWriterOptions(SharpCompress.Common.CompressionType.None, finalizeArchiveOnClose: true) { LeaveStreamOpen = true }; using (TarWriter writer = new TarWriter(memStream, options: options)) { foreach (FileInfo fileToBeTarred in filesInDirectory) { writer.Write(fileToBeTarred.Name, fileToBeTarred); } } memStream.Seek(0, SeekOrigin.Begin); return memStream;
【问题讨论】:
-
这篇文章可能会对您有所帮助:Writing to ZipArchive using the HttpContext OutputStream。
标签: asp.net-core stream tar