【发布时间】:2016-07-29 23:23:44
【问题描述】:
见我的另一个QUESTION。
我已成功设置简单的文件传输,但我注意到尝试回显页面上的任何内容会损坏文件,使其无法打开。
代码如下:
$filename = $_GET['filename'];
$dir = "C:/Users/Me/Desktop/";
$file = realpath($dir . $filename);
//echo "$filename</br>$dir</br>$file";
if (file_exists($file)) {
header('Content-Disposition: attachment; filename="'.basename($file).'"');
header('Content-Type: application/octet-stream');
header('Content-Length: ' . filesize($file));
readfile($file);
exit;
}
这很好用,但是如果我取消注释 echo,下载的文件已损坏并且无法打开。
这是因为以某种方式将回声写入要下载的文件吗?也许(可能)我没有完全了解上面发生的过程。
显然,如果上面的代码无论如何执行成功,echo 将不会显示,但是您会推荐哪些其他调试方法?显然,回显变量值并不总是有效。有其他选择吗?
【问题讨论】:
-
stackoverflow.com/questions/8028957/… > 输出缓冲作为解决方法
-
是的,您的页面将 HTTP 协议数据发送到浏览器,描述它要做什么(我有一个文件给您,这是文件),回显会随机中断此操作,随机字节会破坏输出因为浏览器无法解释服务器告诉它的内容。
-
没错,客户端接收到
$file的内容,回显文本会在文件前面加上该字符串,从而破坏它。要报告该文件不存在,您可以使用error_log 将自定义错误写入日志,也可以使用throw an exception 以您自己的方式处理错误。
标签: php debugging file-transfer