【问题标题】:Force Download Only Displays in Browser, Doesn't Prompt for Download强制下载仅显示在浏览器中,不提示下载
【发布时间】:2013-02-13 22:50:34
【问题描述】:

我似乎无法弄清楚这一点,我知道这很简单。我正在构建一个非常基本的内容管理系统的后端。对于这个特定的部分,我只是想创建一个 PHP 链接,允许下载文件(客户的 CV)。

我的问题:

当点击下载文件的链接时,浏览器不会提示您选择一个本地目录来保存文件 - 它只是在文档内容之前和之后显示文件和一堆符号(我假设这是文件的打开和关闭 exif 数据,供应用程序解密)。

如何强制浏览器提示用户输入“另存为...”框?

<?php
require("connect.php");
$query = "SELECT * FROM kb_info LIMIT 1";

$result = mysql_query($query, $link);
while ($row = mysql_fetch_array($result)) {
    $file_extension = end(explode(".", $row["extension"]));

    if ($file_extension == doc) {

        header('Content-disposition: attachment; filename='.$row["extension"]);
        header('Content-type: application/doc');
        header ("Content-Length: ".filesize($row["extension"]));
        readfile($row["extension"]);
        exit;

    }
    if ($file_extension == docx) {

        header('Content-disposition: attachment; filename='.$row["extension"]);
        header('Content-type: application/docx');
        header ("Content-Length: ".filesize($row["extension"]));
        readfile($row["extension"]);
        exit;

    }
    if ($file_extension == pdf) {

        header('Content-disposition: attachment; filename='.$row["extension"]);
        header('Content-type: application/pdf');
        header ("Content-Length: ".filesize($row["extension"]));
        readfile($row["extension"]);
        exit;

    }
}    
?>  

非常感谢,

乔希

【问题讨论】:

  • 我对 PHP 也很陌生,如果您有任何其他标记建议,请告诉我!谢谢
  • 几件事 - 您可以尝试使用 CASE 开关而不是多个 IF 语句。此外,文件扩展名应在if ($file_extension == pdf) 部分的引号中。
  • @kkhugs 我添加了CASE,但是对于扩展名周围的引号,您是指它正在检查的变量周围吗?还是围绕IF 检查的静态值?

标签: php content-management-system download


【解决方案1】:

我认为问题可能在于 PHP 文件中的某处存在一些空白,这导致标头未正确发送,因此您会看到整个输出。

我建议以下步骤:

  1. 检查“connect.php”并在文件的开头/结尾查找空行/空格并将其删除

  2. 以这种方式调整您的 php 文件,即您在文件末尾省略结束标记 ?&gt; - 这样您就不会在文件末尾得到空行

    李>
  3. 如果以上内容还不够,您需要检查 apache 和 php 错误日志和/或设置错误日志,因此您还会看到警告 - 如果标头未正确发送或如果还有其他错误

【讨论】:

    【解决方案2】:

    我用于下载的标题:

            header("Pragma: public");
            header("Expires: 0");
            header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
            header("Cache-Control: public");
            header("Content-Description: File Transfer");
            header("Content-type: application/force-download");
            header("Content-Disposition: attachment; filename=".$file); 
            header("Content-Type: application/octet-stream");
            header("Content-Transfer-Encoding: binary");
            header("Content-Length: ".$bytes."");
    

    【讨论】:

    • 即使有这些标题,它仍然会在浏览器中显示 doc + exif,并且不会提示实际下载。
    • 你使用什么网络服务器?标头是否正确发送? (尝试在脚本 ob_start() 的顶部添加;) .... 对我来说这个脚本有效,刚刚测试过;在没有你的mysql代码的情况下尝试一下,只要让脚本尽可能简单就能解决问题。
    猜你喜欢
    • 2016-07-31
    • 2013-10-15
    • 1970-01-01
    • 2012-01-18
    • 2017-02-15
    • 1970-01-01
    • 2011-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多