2

我正在网页上进行以下操作:单击元素将一组数据(附加到元素)发送到我的服务器,然后生成自定义 zip 文件:

$.post(urlprefix + 'makeZip.php', params, function(data){
    window.location = urlprefix + 'getZip.php?file=' + data; //get file
}).error(handleAJAXError);

makeZip.php工作得很好,并返回客户端应该下载的(临时)zip文件的名称。由于我想保持服务器清洁,我通过另一个名为的脚本路由文件,该脚本getZip.php执行以下操作:

/* RETURN REQUESTED FILE AND DELETE FROM SERVER*/
$filename = $_GET['file'];
/* TRANSFER FILE CONTENTS */
header('Content-type: application/zip');
header('Content-Disposition: attachment; filename="customDownload.zip"');
header('Content-Length: '.filesize($filename));
readfile($filename);
/* REMOVE FILE FROM SERVER */
unlink($filename);

所有浏览器都会成功下载文件,但我面临一个问题:文件可能会变得相当大(高达 200MB),所以我认为估计下载需要多长时间会很好。这就是我发送Content-Length标头的原因(指定的文件大小是正确的)。然而,我测试过的所有浏览器都告诉我文件大小未知(这可能导致用户跳过下载)。

这是我的标题信息的某种问题吗?是客户端的问题吗?我应该使用另一种方法让客户端下载文件吗?

4

1 回答 1

6

如果客户端在下载通过 readfile 提供的文件时在对话框中显示“未知文件大小”,您最好检查您的服务器上是否安装了mod_deflate, mod_gzip,mod_something-that-shrinks-http并为给定下载设置异常。

更多信息在这里

由 m90编辑:

在我的特殊情况下(运行 Apache),我使用以下方法关闭了收缩功能:

@apache_setenv('no-gzip', 1);
@ini_set('zlib.output_compression', 0);

现在在所有浏览器中都可以正确发送和接收文件大小标头

于 2012-09-17T10:46:05.820 回答