6

这很奇怪

我有一个脚本,它通过浏览器将本地 zip 文件发送给用户。到目前为止,该脚本运行良好,没有任何问题。今天我的同事通知我脚本正在发送零长度文件。

一些背景资料:

  • 脚本出错前服务器设置未修改
  • 测试了不同的浏览器(在 Chrome/Firefox 上相同)
  • 以前的 zip 文件(以前运行良好)也是零长度的
  • 脚本在服务器上找到文件
  • 文件大小(为调试而回显时)正确
  • 尝试按照此处的建议调整服务器设置和脚本,但没有成功。

更新:

  • is_readable()返回 1
  • 文件大小可能在 5Mb 和 100Mb 之间变化(不具体)
  • $zip_file保存文件路径
  • $zip_name保存 zip 名称
  • 文件实际上是零长度(在文本编辑器中打开它不包含单个字节)
  • error_reportingis On( E_ALL) 什么都不显示
  • 没有标题,浏览器会正确显示 zip 'source'
  • Safari 说:' 0 字节?无法解码原始数据的第一个有用(?)症状

有问题的片段:

if (file_exists($zip_file)) {
    header('Content-type: application/zip');
    header('Content-disposition: filename="' . $zip_name . '"');
    header("Content-length: " . filesize($zip_file));
    readfile($zip_file);
    exit();
}

我怎样才能轻松调试呢?

在此先感谢,法布里克

4

4 回答 4

5

http://www.php.net/manual/en/function.readfile.php#102137

需要注意的是,在示例中:

header('Content-Length: ' . filesize($file));

$file 应该是文件的完整路径。否则内容长度不会总是被设置,通常会导致可怕的“0字节文件”问题。

于 2011-03-21T08:19:12.143 回答
1

我认为这里最大的问题是您发送文件的方式,您是否尝试过在块内发送:

if (file_exists($zip_file))
{
    header('Content-type: application/zip');
    header('Content-disposition: filename="' . $zip_name . '"');
    header("Content-length: " . filesize($zip_file));

    $resource = fopen($zip_file,'r');
    while(!feof($resource))
    {
         $chunk = fread($resource,4096);
         //....
         echo $chunk;
    }

    exit();
}
于 2011-03-21T08:29:26.313 回答
0

尝试添加attachment;和使用不同的浏览器。

header('Content-disposition: attachment; filename="' . $zip_name . '"');
于 2011-03-21T09:11:49.863 回答
0

我的。瘸。过错。对不起大家。

一周前刚刚调整了代码并添加了:

if (substr_count($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip')) {
    ob_start('ob_gzhandler');
} else {
    ob_start();
}

是什么导致了这个异常。:(

于 2011-03-21T09:28:34.460 回答