2013-02-27 113 views
2

我似乎无法弄清楚这一点,我知道这很简单。我正在建立一个非常基本的内容管理系统的后端。对于这个特定的部分,我只是试图创建一个允许下载文件(客户的简历)的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

+0

我也很新PHP,如果你有任何其他的标记建议让我知道!谢谢 – j0sh1e 2013-02-27 22:34:19

+0

夫妇的事情 - 你可以尝试一个'CASE'开关,而不是多个'IF'语句。另外,文件扩展名应该在'if($ file_extension == pdf)'部分引用。 – 2013-02-27 22:43:16

+0

@kkhugs我添加了'CASE',但是对于扩展周围的引号,你的意思是围绕它正在检查的变量吗?或者围绕着“IF”正在检查的静态值? – j0sh1e 2013-02-28 01:51:36

回答

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

即使使用这些标题,它仍会在浏览器中显示doc + exif,并且不会提示实际下载。 – j0sh1e 2013-02-28 01:50:59

+0

你使用什么webserver?报头是否正确发送? (尝试在脚本的顶部添加ob_start();)....对于我来说,这个脚本的工作原理就是测试它;尝试没有你的MySQL代码,只是尽可能简单的脚本,以获得什么问题。 – 2013-02-28 17:06:55

1

我认为这个问题可以有一些空白的地方在PHP文件,这导致标题无法正确发送,因此您会看到整个输出。

我建议以下步骤:

  1. 检查“connect.php”,并在文件的开头/结尾寻找空行/空格和删除它们

  2. 适应你PHP文件的方式,你离开结束标签?>在文件的末尾 - 这样你就不会在文件的末尾得到空行

  3. 如果上述不够,你需要检查你的Apache和PHP错误日志和/或设置错误日志记录,所以你也看到警告 - 你会被告知如果标题没有正确发送或如果有一些其他错误

相关问题