7

我在 PHP 中使用数据库查询来检索二进制文件。但是当我试图强制下载它时, header('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;

任何的想法?谢谢。

4

2 回答 2

6

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

您有二进制数据$file而不是第一个参数所需的实际文件名。因此你会得到一个错误。(启用 error_reporting!看不到错误和没有错误是两件不同的事情。)

所以你想用的有strlen($file),没有filesize()

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

于 2012-06-24T10:40:21.837 回答
1

通过查看查询,我猜想 in$row['data']是存储的二进制数据。要设置正确的 Content-Length 标头,您应该使用mb_strlen($row['data']);. 如果您的机器上没有激活多字节支持(mb_ 函数),请使用 strlen()。但请注意,这可能会导致错误的结果,因为二进制数据实际上可能包含 EOF 字节序列并返回太短的长度。使用 mb_strlen 函数,您就处于保存状态。

于 2013-10-18T10:01:10.117 回答