强制下载仅在浏览器中显示,不提示下载

时间:2013-02-27 22:33:12

标签: php content-management-system download

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

我的问题:

当点击下载文件的链接时,而不是浏览器提示您选择本地目录来保存文件 - 它只是在文档内容之前和之后显示文件和一堆符号(我假设这是文件的打开和关闭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;

    }
}    
?>  

非常感谢,

Joshie

2 个答案:

答案 0 :(得分:1)

我认为问题可能是PHP文件中存在某些空格,导致标题未正确发送,因此您可以看到整个输出。

我建议采取以下步骤:

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

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

  3. 如果以上内容不够,您需要检查您的apache和php错误日志和/或设置错误登录,这样您还会看到警告 - 如果标题未正确发送,您将被告知如果还有其他错误

答案 1 :(得分:0)

我用于下载的标题:

        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."");