【问题标题】:ASP.NET Core Streaming directory content directly from diskASP.NET Core 直接从磁盘流式处理目录内容
【发布时间】:2022-10-18 20:40:55
【问题描述】:

我有一个目录,里面有几个文件,我想根据请求发送给客户。为了做到这一点,我必须以某种方式将文件组合在一个文件中,但我不想将此文件(即使是暂时的)存储在文件系统中或完全存储在内存中。换句话说,我需要创建一个存档并将其直接流式传输到客户端。

一个简单的候选者似乎是一个 tarball。如果我理解正确,tarball 不包含全局文件头,而只是存档中各个文件的头:
HeaderFile1-File1-glue-HeaderFile2-File2-finalizer

假设这是正确的,则可以生成一个 tarball,而不必将其完全存储在内存中或其他地方,但我已经研究了 SharpCompress 和 SharpZipLib 库,但似乎都不支持这样的东西。

在我尝试完全自己实施之前,有两个问题:

  1. 有没有更简单的方法将目录内容流式传输到客户端。

  2. 是否有任何常用的库支持像我描述的那样流式传输 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;
    

【问题讨论】:

标签: asp.net-core stream tar


【解决方案1】:

感谢 Chen 的评论,我找到了一个带有 zip 档案的工作解决方案。

现在看起来很明显,但诀窍是直接写入响应体输出流。

using (ZipArchive archive = new ZipArchive(Response.BodyWriter.AsStream(), // <--
                                           ZipArchiveMode.Create,
                                           leaveOpen: true))
{
    foreach (string path in paths)
    {
        string fname = Path.GetFileName(path);
        archive.CreateEntryFromFile(path, fname);
    }
}

然后在控制器中返回new EmptyResult();


经过一番修改后,我发现最好的方法是创建一个派生自ActionResult 的类,并将上面的代码粘贴到覆盖的ExecuteResult 方法中。

在这种情况下,您还可以轻松设置响应标头并在 asp.net 管道中更好地工作。

【讨论】:

    猜你喜欢
    • 2013-04-29
    • 2021-09-06
    • 2020-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-21
    • 2011-09-06
    相关资源
    最近更新 更多