0

我想强制下载 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 的问题遇到了同样的问题并尝试了他们的解决方案,但徒劳无功。

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

4

2 回答 2

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>
于 2013-08-19T09:45:15.457 回答
1

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

正如您在最初的帖子中所看到的,一旦您单击链接,您就会放弃对浏览器的所有控制权,以便它会按照它认为合适的方式处理文件。通常这涉及尝试找到系统可以找到的任何应用程序或插件来处理您的文件。

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

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

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

3 - 在设置标题之前处理无法找到文件的情况,例如 die("The file could not be found")。

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

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 想象成您常用的实时编程语言,而是将其想象成打印机。它会打印您告诉它的所有内容,并以合理大小的块提供服务。在到达终点之前无法停止它,除非您在适当的条件下再次调用脚本,否则不可能探索两个相反的分支代码路径。

希望聊天对你有所帮助。

于 2013-08-20T11:26:18.033 回答