【问题标题】:PHP File Transer - echo breaks things, alternate for debugging?PHP 文件传输 - 回声破坏了事情,调试的替代方案?
【发布时间】: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


【解决方案1】:

是的,如果您回显某些数据,它将成为您发送的任何文件的一部分,并且可能会损坏它。

我建议您查看error_log 函数。它会让您写入日志文件,这不会影响输出。您可以定期查看日志并检查是否有任何重要错误。

【讨论】:

    猜你喜欢
    • 2017-09-14
    • 1970-01-01
    • 2021-08-15
    • 2017-08-21
    • 2015-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多