header('Content-type:application / octet-stream')导致0字节文件

时间:2012-06-24 08:06:47

标签: php download

我在PHP中使用数据库查询来检索二进制文件。但是当我试图强制下载它时,标题('Content-type:application / octet-stream')行会导致0字节文件。如果没有该行,我可以下载包含完整内容的文件。这是一个肯定的二进制文件,所以我无法理解为什么该行会导致问题。 代码:

$result = mysql_query("SELECT data FROM stored_file WHERE file_name = '$q'");

while($row = mysql_fetch_array($result))
{
    $file = $row['data'];
}


    header('Content-disposition: attachment; filename='.$q);
    header('Content-type: application/octet-stream');
    header('Content-Length: '.filesize($file));
    header("Pragma: no-cache");
    header("Expires: 0");
    echo $file;

有什么想法吗?感谢。

2 个答案:

答案 0 :(得分:5)

filesize()不会返回有意义的值。

根据第一个参数的要求,您有$file 实际文件名的二进制数据。因此你会得到一个错误。 (启用error_reporting!没有看到错误,没有它们是两回事。)

所以你想要使用的是strlen($file),而不是filesize()

顺便说一下,application/octet-stream或其他填写内容对强制下载没有用处。它是Content-Disposition:标题,对于这种效果至关重要。您仍然可以发送正确的MIME类型。

答案 1 :(得分:1)

从查询查询我想在$row['data']中存储了二进制数据。要设置正确的Content-Length标头,您应该使用mb_strlen($row['data']);。如果您的计算机上未激活多字节支持(mb_功能),请使用strlen()。但请注意,这可能会导致结果不佳,因为二进制数据实际上可能包含EOF字节序列并返回太短的长度。使用mb_strlen函数,您可以保存。

相关问题