【发布时间】:2018-09-17 21:49:36
【问题描述】:
我正在尝试在我的 C# MVC 项目中编写一个方法,该方法从 S3(或任何地方)流式传输文件,并在将压缩流发送给用户之前将其即时压缩为 zip 文件。到目前为止,我已经找到了几种从流中创建 zip 文件的方法,方法是将其保存到磁盘然后正常返回,但我想跳过保存到磁盘并使用缓冲区流方法。我正在尝试下载一个非常大的文件 (4gb+),该文件很容易压缩到原始大小的一小部分。
到目前为止,我有这个避免磁盘,但似乎首先将整个文件加载到内存中:
using( var memoryStream = new MemoryStream() )
{
using( var archive = new ZipArchive( memoryStream, ZipArchiveMode.Create, true ) )
{
var zipEntry = archive.CreateEntry( File );
using( var entryStream = zipEntry.Open() )
{
S3.StreamFile( File, Bucket ).CopyTo( entryStream );
}
}
return base.File( memoryStream.ToArray(), "application/zip", File + ".zip" );
}
一个类似的问题 (Creating a ZIP Archive in Memory Using System.IO.Compression) 只有涉及写入磁盘的答案。
【问题讨论】:
-
但似乎首先将整个文件加载到内存中 - 你的意思是
S3.StreamFile?你有什么证据?Stream.CopyTo()使用81920的复制缓冲区大小。可以分享minimal reproducible example吗? -
您需要围绕 Stream 对象创建一个包装器(外观模式),它将跟踪流位置。那么您将不需要任何 MemoryStream。您还需要直接在返回和 EmptyResult 中写入输出流
标签: c# amazon-s3 asp.net-mvc-5