下载的文件损坏 - 头部信息

3

我一直在努力弄清楚问题所在,但每次下载图像并尝试打开它时,都会显示文件已损坏。

$h是从数据库中提取的路径,$h成功地在页面上显示了该图像,但我不知道为什么无法下载。有任何想法吗?

header("Pragma: public"); // required   
header("Cache-Control: private",false); // required for certain browsers  
header('Content-Length: '. filesize("../".$h));  
header('Content-Type: application/octet-stream');  
header('Content-Disposition: inline; filename="'.md5($h).$ext.'"');  
header('Content-Transfer-Encoding:binary');  
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');  

readfile("../".$h);

你尝试过保存下载的文件并将其与服务器上的内容进行比较吗? - Marc B
似乎您的头部数据有些不正确,请查看md5哈希值和文件大小。 - Daniel West
是的,我可以右键单击图像,然后它就可以正常下载了。嗯,我以为是头文件的问题,但是找不出原因。我会删除哈希标记并查看它的作用。 - Jason
这不是问题,但删除Content-Transfer-Encoding头字段也无妨。在HTTP中它并不存在。 - Julian Reschke
2个回答

9
也许您可以在readfile行之前添加以下两个命令。
ob_clean();
flush();
readfile($file);

这些行是在PHP文档中readfile示例中的。


1
谢谢!仅使用 ob_clean() 就解决了我的问题。带上 flush() 函数它只会显示内容。 - Aiphee
是的,我也需要删除 flush()。 - Pierre

2

试试这个:

$localPath = realpath("../$h");
if (!file_exists($localPath)) {
  exit("Cannot find file located at '$localPath'");
}

header('Pragma: public'); // required   
header('Content-Length: '.filesize($localPath));  
header('Content-Type: application/octet-stream');  
header('Content-Disposition: attachment; filename="'.md5($localPath).'.'.$ext.'"');  
header('Content-Transfer-Encoding: binary');  
header('Cache-Control: must-revalidate, post-check=0, pre-check=0', false);  
header('Cache-Control: private', false); // required for certain browsers  

readfile($localPath);
exit;

我已经尝试下载了,但仍然无法打开它。你认为可能是文件权限的问题吗?无论如何,在我的wamp上运行我的代码会有所不同。 - Jason
这里最可能的答案是您的文件中存在一些前导/尾随空格,在 <?php ?> 标签之前或之后。这些应该是脚本中的第一个和最后一个字符。您可以安全地省略 ?> 结束标记。您还可能在上面的代码之前调用了 echoprint 等函数 - 请记住,当执行此操作时,除文件数据外,您不能将任何内容写入输出缓冲区。另外,请确保在 readfile() 调用之后立即调用 exit/die 函数。 - DaveRandom
啊,我真的太蠢了,在 ?> 后面多加了一个空格,现在完全OK了..谢谢DaveRandom。 - Jason
1
@Jason,就像我说的那样,你可以安全地省略 ?> 标签,PHP 不会报错。这有助于避免这种问题。 - DaveRandom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接