PHP Force下载错误

时间:2014-03-28 16:01:33

标签: php download

我已经尝试了很多PHP脚本来构建强制下载页面,但每次都失败了。我在每个页面上都有一个下载链接,然后单击我希望用户被重定向到另一个页面并开始下载。

我将参数中的完整绝对路径网址传递为<a href="download.php?filename=http://www.abc.com/maps/map.pdf" target="_blank">Download PDF</a>

我的download.php文件的代码是

<?php
$file = $_GET["filename"];
    $file_name = basename($file);
    header("Content-Type: application/zip");
    header("Content-Disposition: attachment; filename=$file_name");
    header("Content-Length: " . filesize($file)); //added this line
    readfile($file);
?>

如果您的下载没有开始

<a href="<?php echo $_GET["filename"]; ?>" target="_blank">click here</a>

错误:

Download.php is getting the parameter filename value correctly but says 

Warning: Cannot modify header information - headers already sent by (output started at /home/content/72/11973872/html/filerepairtool/down/download.php:9) in /home/content/72/11973872/html/filerepairtool/down/download.php on line 20

Warning: Cannot modify header information - headers already sent by (output started at /home/content/72/11973872/html/filerepairtool/down/download.php:9) in /home/content/72/11973872/html/filerepairtool/down/download.php on line 21

我想在大多数软件下载站点中构建一个类似下载页面的页面,点击下载链接将我们带到另一个URL,上面写着“您的下载应该在10秒内开始(第二次倒计时)”或点击此处下载如果它没有启动“

请分享解决方案

1 个答案:

答案 0 :(得分:0)

你的代码签出,我测试了它。

还有其他因素造成这种情况。

最有可能<?php之前有一个空格,在测试时会再现确切的错误消息。

您还可以使用byte order mark或其他形式的输出,用作附带文件等。

  • 偶数空格计为标题前输出。

可能的情况:

  • PHP上面有更多的PHP和/或HTML
  • 一个cookie
  • 字节顺序标记
  • PHP上方的包含文件
    • 有关您当前问题的更多详细信息,请参阅StackOverflow上的
    • Consult this page

<强> 旁注
根据我在您发布的another question中看到的内容,您可能在PHP上面包含一个文件。


以下情况会导致错误:(考虑为标题之前的输出)

<?php
include 'file.php';
?>

<?php
$file = $_GET["filename"];
    $file_name = basename($file);
    header("Content-Type: application/zip");
    header("Content-Disposition: attachment; filename=$file_name");
    header("Content-Length: " . filesize($file)); //added this line
    readfile($file);
?>

将会:

<!DOCTYPE html>
<head>
<title>Page title</title>
<body>
Hello world

<?php
$file = $_GET["filename"];
    $file_name = basename($file);
    header("Content-Type: application/zip");
    header("Content-Disposition: attachment; filename=$file_name");
    header("Content-Length: " . filesize($file)); //added this line
    readfile($file);
?>
</body>
</html>

可能的快速解决方法: ,但并不总是成功。

使用ob_start();ob_end_flush();