动态创建可变zip存档,估计内容长度的文件大小

时间:2017-01-05 14:10:16

标签: asp.net-web-api zip streaming asp.net-web-api2

我维护一个网站,用户可以将图片和其他文件放在购物车中。在选择用户希望下载的所有各种内容之后,他可以结账。直到'现在,事先生成了一个存档,用户在生成完成后收到了一封包含该文件链接的电子邮件。

我现在通过使用web api和push stream直接生成存档来改变它。我的代码动态提供zip,zip64或.tar.gz,具体取决于估计的文件大小和操作系统。出于性能原因,压缩设置为最佳速度('没有'会使zip存档与Mac OS不兼容,我使用的gzip库并不提供任何服务)。

到目前为止这种方法很有效,但用户在下载文件时不再有进度条,因为我没有设置内容长度。解决这个问题的最佳方法是什么?我试图猜测生成的文件大小,但是浏览器要么提前取消下载,要么停止99,x%并等待丢失的字节,从而导致估计文件大小和实际文件大小之间的差异。 / p>

我的第一个想法是猜测生成的文件大小总是有点大,并用零填充其余文件?

我见过很多文件托管商提供从文件夹中选择文件并将它们放入zip文件的可能性,并且所有文件托管商都有正确的(?)文件大小和进度条。任何最佳做法?谢谢!

2 个答案:

答案 0 :(得分:5)

这只是一些想法,也许你可以使用它们:)

使用Web API / HTTP,正常的方法是响应包含文件的长度。由于在呼叫结束后首先收到响应,因此生成文件的实际时间不会在Windows等待光标以外的任何浏览器中显示任何进度条。

你可以做的是采用两步法。

生成zip文件 使用SignalR创建类似双工的通道,以提供有关文件生成的反馈。

下载zip文件 生成文件后,您应该知道文件大小,浏览器将在下载时显示进度条。

答案 1 :(得分:4)

看起来应该使用块扩展来解决这个问题,但它似乎永远不会超过draft

所以我猜你没有任何进展或者预先发送文件大小。

似乎生成exact size zip档案比添加零填充更复杂。

另一个选项可能是pre-generate the zip文件而不存储它只是为了确定大小。

但我只是想知道为什么不使用焦油?它没有压缩,因此从单个文件的大小开始就很容易determine it's final size,OSx和Linux也应该支持它。 Windows应该能够处理没有压缩的zip存档,因此类似的技巧也可以使用。