(HTML)下载PDF文件,而不是在浏览器中单击时打开它们

我想知道如何使PDF文件链接可下载,而不是在浏览器中打开它们? 这是如何完成的HTML? (我会认为这是通过JavaScript或其他)。

你不能用HTML来做到这一点。 这是一个基于服务器的解决scheme。 您必须stream式传输文件,以便浏览器触发保存对话框。

我build议不要这样做。 用户如何与PDF交互应留给用户。

更新(2014年):

所以…这个答案仍然有很多downvotes。 我认为其中的一部分就是4年前的答案,Sarim指出,现在有HTML5 download属性可以处理这个问题。

我同意,并认为Sarim的答案是好的(如果OP返回,它可能应该是select的答案)。 但是,这个答案仍然是处理这个问题的可靠的方法(正如YiğitYener的答案所指出的那样 – 人们很同意)。 虽然下载属性已经获得支持,但它仍然是多余的:

http://caniuse.com/#feat=download

用html5,现在是可能的。 在元素中设置一个“下载”属性。

 <a href="http://link/to/file" download="FileName">Download it!</a> 

资料来源: http : //updates.html5rocks.com/2011/08/Downloading-resources-in-HTML5-a-download

这只能通过服务器端代码设置一个http响应头来实现。 即;

 Content-Disposition: attachment; filename=fname.ext 

您需要更改发送的http头。 根据您的服务器,您可以修改您的.htaccess如下:

 <FilesMatch "\.(?i:pdf)$"> ForceType application/octet-stream Header set Content-Disposition attachment </FilesMatch> 

您可以使用

 Response.AddHeader("Content-disposition", "attachment; filename=" + Name); 

看看这个例子:

http://www.codeproject.com/KB/aspnet/textfile.aspx

这适用于ASP.NET。 我相信你可以在所有其他服务器端语言中find类似的解决scheme。 然而,就我所知,没有JavaScript解决scheme。

您将需要使用PHP脚本(或者其他服务器端语言)

 <?php // We'll be outputting a PDF header('Content-type: application/pdf'); // It will be called downloaded.pdf header('Content-Disposition: attachment; filename="downloaded.pdf"'); // The PDF source is in original.pdf readfile('original.pdf'); ?> 

并使用httaccesredirect(重写)到PHP文件,而不是PDF

没有html5属性可以通过使用php来实现:

用下面的代码创build一个名为download.php的 php文件:

 <?php ob_start(); $file = "yourPDF.pdf" if (file_exists($file)) { header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename='.basename($file)); header('Content-Transfer-Encoding: binary'); header('Expires: 0'); header('Cache-Control: must-revalidate'); header('Pragma: public'); header('Content-Length: ' . filesize($file)); ob_clean(); flush(); readfile($file); exit(); } 

现在,如果你想自动开始下载pdf写这个javascript:

 <script>window.location = "download.php";</script> 

如果你想要这个工作在一个链接,使用这个…

 <a href='javascript:window.location = "download.php"'> Download it! </a> 

最适合我的解决scheme是Nick在他的博客上写的

他的解决scheme的基本思想是使用Apache服务器头模,并编辑.htaccess包含一个FileMatch指令,强制所有* .pdf文件作为stream而不是附件。 虽然这实际上并不涉及编辑HTML(根据原始问题),但它本身不需要任何编程。

我首选Nick的方法的原因是因为它允许我在每个文件夹的基础上设置它,所以PDF中的文件夹仍然可以在浏览器中打开,同时允许其他人(我们希望用户编辑,然后重新上传)被迫下载。

我还想补充一点,PDF有一个选项可以通过API发布/提交可填写的表单到你的服务器,但是这需要一段时间才能实现。

第二个原因是因为时间是一个考虑因素。 编写一个PHP文件处理程序来强制标题()中的内容处置将比API更less的时间,但仍比Nick的方法更长。

如果你知道如何打开Apache mod并编辑.htaccss,你可以在10分钟内得到这个。 它需要Linux主机(不是Windows)。 这可能不适合所有用途,因为它需要高级服务器访问权限进行configuration。 因此,如果您曾经说过,那可能是因为您已经知道如何做这两件事情。 如果没有,请查看Nick的博客以获取更多说明。

如果你正在使用HTML5(我想现在每个人都使用它),有一个属性称为download

恩。 <a href="somepathto.pdf" download="filename">

这里的filename是可选的,但是如果提供的话,它将把这个名称用于下载的文件。

由于html5的方式(我以前的答案)不适用于所有的浏览器,所以又一个稍微黑客的方式。

此解决scheme要求您提供来自同一个域的目标文件,或具有CORS权限。

  1. 首先通过XMLHttpRequest(Ajax)下载文件的内容。
  2. 然后通过base64编码文件的内容来创build数据URI,并将media-type设置为application/octet-stream 。 结果应该看起来像

data:application/octet-stream;base64,SGVsbG8sIFdvcmxkIQ%3D%3D

现在设置location.href = data 。 这将导致浏览器下载文件。 不幸的是,你不能这样设置文件名或扩展名。 摆弄媒体types可能会产生一些东西。

查看详细信息: https : //developer.mozilla.org/en-US/docs/Web/HTTP/data_URIs

当你想直接从浏览器下载任何图像或PDF文件,而不是在新标签中打开它,然后在JavaScript中,你应该设置值的下载属性创builddynamic链接

  var path= "your file path will be here"; var save = document.createElement('a'); save.href = filePath; save.download = "Your file name here"; save.target = '_blank'; var event = document.createEvent('Event'); event.initEvent('click', true, true); save.dispatchEvent(event); (window.URL || window.webkitURL).revokeObjectURL(save.href); 

对于新的Chrome更新,某些时间事件不起作用。 因为下面的代码会被使用

  var path= "your file path will be here"; var save = document.createElement('a'); save.href = filePath; save.download = "Your file name here"; save.target = '_blank'; document.body.appendChild(save); save.click(); document.body.removeChild(save); 

追加小孩和除去小孩对Firefox,Internet Explorer浏览器是有用的。 在铬上它将工作,而不会追加和删除孩子

行为应该取决于如何设置浏览器来处理各种MIMEtypes。 在这种情况下,MIMEtypes是application / pdf。 如果您想强制浏览器下载文件,您可以尝试在PDF文件上强制使用不同的MIMEtypes。 我build议反对这一点,因为它应该是用户select当他们打开PDF文件时会发生什么。

我需要为在特定文件夹中由dynamic名称创build并由IIS提供服务的文件执行此操作。

这对我工作:

  • 在IIS中,转到该文件夹​​并双击HTTP Response Headers。
  • 用以下信息添加一个新的标题:

    Name: content-disposition Value: attachment

(来自: http : //forums.iis.net/t/1175103.aspx?add+CustomHeaders+only+for+certain+file+types+ )