【问题标题】:forcing a file download with php强制使用 php 下载文件
【发布时间】:2010-11-03 04:32:01
【问题描述】:

我知道如何进行下载,当下载发生时,它会从导致下载的网页附加 html。如何过滤掉 HTML?

【问题讨论】:

  • 您能否澄清一下,最好是一些示例代码?不清楚您所说的“导致下载”是什么意思

标签: php download content-disposition


【解决方案1】:

如果我理解正确,这是一个常见问题。在任何输出发生之前,我在 index.php(开始/根/条目文件)的开头使用 ob_start 解决了这个问题,对于下载,我执行以下操作:

  ob_end_clean();
  header("Content-Type: application/octet-stream; "); 
  header("Content-Transfer-Encoding: binary"); 
  header("Content-Length: ". filesize("thefileinquestion").";"); 
  header("Content-disposition: attachment; filename=thefileinquestion");
  $fp = fopen(thefileinquestion, "r"); 
  while(!feof($fp)){
    $buffer = fread($fp, 1024); 
    echo $buffer;
    flush(); 
  } 
  fclose($fp);
  die();

更新

ob_start 命令缓冲任何输出(例如通过 echo、printf)并防止在您实际下载之前将任何内容发送给用户。 ob_end_clean 会停止此行为并再次允许直接输出。 HTH。

【讨论】:

  • 您可以通过调用 readfile() 替换从 '$fp = ...' 到 'fclose()' 的所有内容。
  • 这看起来是我臃肿代码的一个非常简洁的替代方案。以后会用这个!谢了!
  • 1) 发送实际的媒体类型,而不是“application/octet-stream”。 2) HTTP 中没有“Content-Transfer-Encoding”头域。真的。
【解决方案2】:

我了解到您正在尝试从 PHP 页面输出一些流以供下载?

如果是这样,则不要从包含 HTML 的页面输出该内容,而是重定向到单独的 php 页面,该页面仅输出下载流,必要时带有标题。

【讨论】:

  • 这就像一个一半的答案。它就在“如果要下载,请强制下载”上方。
【解决方案3】:

确保文件流完成后没有输出其他数据。在文件流完成后,使用对 exit() 的调用来结束页面执行。结束 '?>' 标记之后的任何字符(例如换行符)也可能导致下载问题。

将下载脚本移动到自己的文件中应该更容易发现任何问题,因为它只做一件事。为避免输出任何最后的换行符,在这种情况下,您也可以在脚本末尾省略结束 '?>' 标记。

【讨论】:

    猜你喜欢
    • 2010-11-30
    • 1970-01-01
    • 2012-01-19
    • 2011-11-08
    • 2012-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多