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

yan*_*kun 10 streaming zip asp.net-web-api asp.net-web-api2

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

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

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

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

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

Mic*_*ael 5

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

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

你可以做的是使用两步法.

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

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


Bin*_*nus 5

看起来这个问题应该使用块扩展来解决,但它似乎永远不会比草案更进一步。

所以我猜你要么没有进展,要么预先发送文件大小。

似乎生成精确大小的 zip档案比添加零填充更棘手。

另一种选择可能是预先生成 zip文件而不存储它只是为了确定大小。

但我只是想知道为什么不直接使用 tar?它没有压缩,因此很容易根据单个文件的大小预先确定它的最终大小,并且 OSx 和 Linux 也应该支持它。而且 Windows 应该能够处理非压缩的 zip 档案,因此类似的技巧也可能起作用。