【问题标题】:force Download file in php?强制在php中下载文件?
【发布时间】:2013-08-19 09:42:17
【问题描述】:

我想强制下载 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>';
 }

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

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

【问题讨论】:

  • 您是否在链接中尝试过 target="_blank"?假设它不会验证所有测试,因为客户端应该选择在哪里打开文件,但也许它会有所帮助。
  • 我不想打开新标签,只需下载文件..
  • 那你能给我们展示一个现场吗?也许我们可以这样看问题。我认为这里没有足够的信息。
  • @downvoter:why downvote?至少提一下原因..
  • @TheMarlboroMan:检查更新

标签: php header download


【解决方案1】:

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

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>

【讨论】:

  • 在提供pdf文件内容的文件中(例如pdf.php)或.htaccess(更新答案)。
  • 我正在使用 PHP,我应该在脚本顶部还是在 foreach 中包含此标头?...我会再试一次..我之前尝试过,但它给了我结果我想要..
  • 此代码必须放在从http://staging.experiencecommerce.com/ecsite-v3/uploads/'.substr($item['f_resume'], 63) 回显文件的脚本中,而不是在回显该链接的脚本中。
  • 如果可能的话,只提供一个示例,我和万宝路的人聊了聊,这很有帮助..一个迷你示例代码就可以了..
  • 用户下载文件的名称。
【解决方案2】:

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

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

当您想要强制下载文件时,您只需将演示文稿本身与手头的任务分开即可。在这种特殊情况下:

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

希望聊天对您有所帮助。

【讨论】:

  • 毫无疑问..我从中学到了很多东西..没有其他问题可以解释您提到的缺陷。谢谢。如果可能的话,只需添加其他文件代码和一些 href=somthing? id=34 也..让未来的访客受益..Thx 吨。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多