HTML:强制PDF下载

10

我的页面上有一个PDF文件的链接。

Safari浏览器会直接在网站中打开这个PDF文件,但我想要下载它。

我已经尝试给<a>元素添加target="_blank",但如果在浏览器设置中禁用弹出窗口,则无效。

我应该如何解决这个问题?

谢谢。

3个回答

8
您需要将HTTP头中的Content-Disposition设置为attachment,以便下载该文件。
Content-Disposition: attachment; filename=test.pdf

根据您使用的Web服务器,配置方式可能会有所不同。另一种选择是使用服务器端脚本来流式传输PDF并设置此标题。


但是,他并没有生成PDF文件或通过服务器端脚本传递它。他只是提供一个链接<a href>来下载它。 - shamittomar
正如Darin所说,你只需要配置你的服务器,但这取决于你使用的是哪个服务器。例如:http://www.thingy-ma-jig.co.uk/blog/06-08-2007/force-a-pdf-to-download。 - Quentin
你不能同时下载多个文件(除非将它们放入归档文件中),我建议你将PHP文件做成通用的,参见我的编辑。 - Youssef

8
为了实现这一点,您需要更改 .PDF 文件的标头。
因此,在您的 .htaccess 中,您需要像这样做:
AddType application/octet-stream .pdf

1
使用content-disposition,而不是发送“我不知道这是什么”头部,而应该发送“This is PDF”。 - Quentin
此方法在AskApache网站上有详细描述:http://www.askapache.com/htaccess/ultimate-htaccess-file-sample.html。 - shamittomar
该网站的作者似乎与Apache基金会没有关联,因此它的标题有些可疑。它还包含了很多我不同意的内容。 - Quentin
1
最好说“这是一个PDF”,并添加一个标题,说“它应该被下载”,而不是更改标题说“我不知道这是什么”。后者可以工作,前者仍然更好。 - Quentin
@shamittomar — 正如Darin所说,您可以配置Web服务器以发送内容分发头。您不需要涉及服务器端编程语言来完成这项工作。 - Quentin
显示剩余2条评论

2

您需要使用服务器端脚本(如PHP)动态地强制附加头文件。以下是使用PHP的示例:

<?php
header('Content-type: application/pdf');
header('Content-Disposition: attachment; filename="downloaded.pdf"');
readfile('original.pdf');
?>

编辑:

$file = $_GET['file']; 
readfile($file."pdf");  // Before doing this, check whather the user have permission to download that file.

调用你的脚本:download.php?file=document 将会下载document.pdf


1
如果你正在处理静态文件,最好使用服务器配置。这样更简单。 - Quentin
1
如果他在共享主机上怎么办? - Youssef
有没有基于Apache的托管服务太差,以至于无法使用Apache配置指令设置content-disposition头? - Quentin
1
在这种情况下,使用服务器端脚本来完成是唯一真正的选择(如果你不考虑“获取半靠谱的托管”)。然而,能够配置服务器仍然更好 ;) - Quentin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接