在php下载文件?

时间:2013-08-19 09:42:17

标签: php header download

我想强制下载pdf,doc或docx文件。

使用以下代码,Pdf文件在我的选项卡中打开而不是下载。 我有一个表格,每行都有下载链接。我想点击此链接下载文件。

 foreach($a as $id = > $item) {
     echo '<tr><td><a href="http://staging.experiencecommerce.com/ecsite-v3/uploads/'.substr($item['f_resume'], 63).'" ">';

     //Note:substr($item['f_resume'], 63) is file_name 

     echo '</a></td><td>'.$item['f_date'].'</td></tr>';
 }

我在SO上遇到了一些Question 同样的问题并尝试了他们的解决方案,但是徒劳无功。

当我在foreach中包含解决方案时,页面会在加载时下载文件,当我将解决方案放在外面时,会下载Php脚本。 我哪里错了?

2 个答案:

答案 0 :(得分:3)

您可以设置强制下载的标题:

header('Content-Type: application/force-download');
header('Content-Disposition: attachment; filename="filenamehere.pdf"');

如果您没有使用PHP提供该文件的内容,您可以使用例如设置标题。 .htaccess(需要mod_headers)。

<FilesMatch ".pdf$">
FileETag None
<ifModule mod_headers.c>
Header set Content-Type "application/force-download"
</ifModule>
</FilesMatch>

答案 1 :(得分:1)

在我们整个聊天会议之后,我想我们可以在这里留下这个答案,仅供将来参考:

如您在初始帖子中所见,一旦您点击该链接,您就会放弃对浏览器的所有控制权,以便它按照自己的意愿处理该文件。通常这涉及尝试查找系统可以找到的任何应用程序或插件来处理您的文件。

每当你想强制下载文件时,你所要做的就是将演示文稿本身与手头的任务分开。在这种特殊情况下:

1 - 创建一个新脚本,通过传递的参数识别文件并强制下载,如本网站示例php.net/manual/en/function.readfile.php所示。

2 - 重新编写演示文稿,使链接不再指向文件本身,而是指向具有相应参数的新脚本(例如,download_file.php?file_id =#FILE_ID#)。

3 - 在设置标题之前,处理无法找到文件的情况,例如die(“无法找到文件”)。

一句忠告:不要将文件位置用作参数!!!而是使用可以从数据库中检索的内容然后收集文件位置。如果您将文件位置本身作为参数传递,则没有什么能阻止我这样做:

http://yoursite.com/download_file.php?file=download_file.php
http://yoursite.com/download_file.php?file=index.php
http://yoursite.com/download_file.php?file=whatever_file_there_is

在适当的情况下,例如自动检测所请求文件的xtype,它将允许我访问您的代码并利用任何可能的缺陷

一秒钟和最后的建议:php只能一次输出一个东西。如果您想要输出网站,则之后无法输出pdf文件。这就是为什么 - 除了其他原因 - 你离开手头的不同任务,这也就是为什么当你在打印每个链接后直接尝试下载脚本时,一切都会出错。

如果它有帮助,想象php不是你通常的实时编程语言,而是打印机。它会打印您告诉它的所有内容,并以合理大小的块为其提供服务。在到达终点之前没有停止它,除非你在适当的条件下再次调用脚本,否则不可能探索两个相反的分支代码路径。

希望聊天帮助你。