1

我目前使用 ionic 压缩一些照片,然后在浏览器上将它们发送给用户。基本上是这样的。

using (ZipFile zipFile = new ZipFile())
{
      byte[] data = client.DownloadData("photo.png");

      zipFile.AddEntry("photo.png", data);

      Response.ClearContent();
      Response.ClearHeaders();
      Response.AppendHeader("content-disposition", "attachment; filename=Media.zip");

      zipFile.Save(Response.OutputStream);
}

然而,有时有很多照片高达 15 mb,而且其中有很多。

由于这样的内存被完全使用并且它在完成创建 zip 文件之前就用完了。有没有一种方法可以在不使用如此大量内存的情况下完成压缩文件并将它们发送给用户?也许完全不同的方法?

4

2 回答 2

5

在我看来,您最好将文件写入磁盘(或数据库)的某个地方,最好以流式传输方式......然后给客户端一个允许下载文件的链接 - 再次,在流式传输中时尚。基本上,尽量避免要求完整的文件在任何时候都在内存中。

于 2012-09-28T15:45:54.127 回答
1

除了 Jon 关于将所有内容从内存转移到流式传输的建议之外。

由于您正在谈论已经压缩的图像,因此可以采取更极端的方法:您可以直接从文件中动态创建带有非压缩文件的 Zip,并立即将结果流式传输到浏览器,而无需在内存/磁盘中中间创建 Zip。我不知道现有库是否允许您这样做,或者您需要根据规范编写自己的库(有关链接,请参见Wikipedia on Zip)。

旁注:从您的示例中不清楚您是否需要在请求之间存储数据,但如果您确实考虑了文件的一些进程外存储而不是会话状态。如果您处理大量数据 - 如果可能,请确保为 IIS 使用 x64 进程。

于 2012-09-28T16:00:55.557 回答