PHP readfile返回零长度文件

时间:2011-03-21 08:06:03

标签: php readfile

很奇怪

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

一些背景信息:

  • 在脚本出错之前未修改服务器设置
  • 测试了不同的浏览器(在Chrome / Firefox上相同)
  • 以前的zip文件(之前工作正常)也是零长度
  • 脚本在服务器上找到文件
  • 文件大小(在调试时回显)是正确的
  • 尝试将服务器设置和脚本调整为adviced here但没有成功。

更新

  • is_readable()返回1
  • 文件大小可能在5Mb到100Mb之间(非特定)
  • $zip_file包含文件路径
  • $zip_name包含zip名称
  • 文件实际上是零长度(在文本编辑器中打开,它不包含单个字节)
  • error_reporting OnE_ALL)没有显示任何内容
  • 没有标题,浏览器正确显示zip'源'
  • 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();
}

我如何轻松调试?

提前致谢,fabrik

4 个答案:

答案 0 :(得分:5)

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

  

应该注意的是,在示例中:

     

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

     

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

答案 1 :(得分: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();
}

答案 2 :(得分:0)

尝试添加attachment;并使用其他浏览器。

header('Content-disposition: attachment; filename="' . $zip_name . '"');

答案 3 :(得分:0)

我。瘸。错误。对不起。

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

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

造成这种异常的原因。 :(