php下载不一致的行为

时间:2014-02-11 04:44:04

标签: php http apache2 download

我在这里设置了一些下载脚本,它运行良好。我已经将问题缩小到响应头只是大部分时间被发送,当他们不发生什么事情时,它要求我下载文件,不提供有关它的信息,除了它在磁盘上的名称以及它被下载为“应用程序/八位字节流”。 这是我发送的标题

header('Content-Description: File Transfer');
header('Content-Disposition: attachment; filename="'.$file->logical_name.'"');
header('Content-Type: "'.$mime.'"');
header("Content-Length: ".filesize($this->file));
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Pragma: no-cache');
readfile($this->file);  

所以要明确我的问题,文件信息有时只是发送,当他们不知道我的问题时,没有关于正在发送的文件的信息,因此它被下载为一个已经命名的(如在磁盘上)'应用/八位字节流'

更新

这个dosnt发生在小于100kb的小文件

1 个答案:

答案 0 :(得分:0)

在读取文件之前刷新所有输出解决了问题。 似乎关键是确保所有这些标题在tyring之前实际发送以下载文件(使用readfile()读取文件)

header('Content-Description: File Transfer');
header('Content-Disposition: attachment; filename="'.$file->logical_name.'"');
header('Content-Type: "'.$mime.'"');
header('Content-Length:'.filesize($this->file));
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Pragma: no-cache');
flush();
readfile($this->file);

添加flush()函数解决了这个问题。注意我没有用ob_start启动一个缓冲区,所以我没有做ob_flush,但是如果你这样做可能会这样做