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

时间:2011-07-22 18:09:25

标签: javascript html

我想知道如何将PDF文件链接下载而不是在浏览器中打开它们?这是如何在HTML中完成的? (我假设它是通过javascript或其他方式完成的)。

16 个答案:

答案 0 :(得分:115)

使用html5,现在可以。在元素中设置“下载”attr。

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

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

答案 1 :(得分:77)

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

Content-Disposition: attachment; filename=fname.ext

答案 2 :(得分:33)

您无法使用HTML执行此操作。这是一个基于服务器的解决方案。您必须流式传输文件,以便浏览器触发保存对话框。

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

更新(2014年):

所以......这个答案仍然会得到很多支持。我假设其中一部分是4年前得到的答案,正如Sarim指出的那样,现在有HTML 5 download attribute可以解决这个问题。

我同意,并认为Sarim的答案是好的(如果OP返回,它可能应该是选择的答案)。然而,这个答案仍然是处理它的可靠方法(正如YiğitYane的回答指出的那样 - 奇怪的是 - 人们同意)。虽然下载属性获得了支持,但它仍然不稳定:

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

答案 3 :(得分:13)

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

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

答案 4 :(得分:9)

您将需要使用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');
?>

并使用httacces重定向(重写)到PHP文件而不是pdf

答案 5 :(得分:8)

您可以使用

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

看看这个例子:

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

这适用于ASP.NET。我相信您可以在所有其他服务器端语言中找到类似的解决方案。但是据我所知,没有javascript解决方案。

答案 6 :(得分:4)

如果没有html5属性,可以使用php实现此目的:

使用以下代码创建名为 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>

答案 7 :(得分:3)

如果您想从浏览器直接下载任何图像或pdf文件而不是在新标签中打开它,那么在javascript中您应该设置值以创建动态链接的下载属性

    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浏览器有用。在Chrome上,它可以在不附加和删除子项的情况下工作

答案 8 :(得分:2)

最适合我的解决方案是由Nick on his blog

撰写的解决方案

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

我更喜欢Nick的方法的第一个原因是因为它允许我在每个文件夹的基础上设置它,因此在一个文件夹中的PDF仍然可以在浏览器中打开,同时允许其他人(我们希望用户编辑然后重新编辑的文件夹) -upload)被强制下载。

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

第二个原因是因为时间是一个考虑因素。编写一个PHP文件处理程序以强制在header()中使用内容处理也将花费比API更少的时间,但仍然比Nick的方法更长。

如果你知道如何打开Apache mod并编辑.htaccss,你可以在大约10分钟内完成。它需要Linux托管(不是Windows)。这可能不适合所有用途,因为它需要高级服务器访问才能配置。因此,如果你说访问它可能是因为你已经知道如何做这两件事。如果没有,请查看Nick的博客以获取更多说明。

答案 9 :(得分:2)

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

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

此处filename是可选的,但如果提供,则下载文件将使用此名称。

答案 10 :(得分:2)

由于html5方式(我以前的答案)并非在所有浏览器中都可用,所以还有另一种轻微的黑客攻击方式。

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

  1. 首先通过XMLHttpRequest(Ajax)下载文件的内容。
  2. 然后通过base64对数据URI进行编码,并将媒体类型设置为application/octet-stream。 结果应该看起来像
  3. data:application/octet-stream;base64,SGVsbG8sIFdvcmxkIQ%3D%3D

    现在设置location.href = data。这将导致浏览器下载该文件。很遗憾,您无法通过这种方式设置文件名或扩展名。摆弄媒体类型可能产生一些东西。

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

答案 11 :(得分:1)

行为应取决于浏览器如何设置以处理各种MIME类型。在这种情况下,MIME类型是application / pdf。如果要强制浏览器下载文件,可以尝试在PDF文件上强制使用不同的MIME类型。我建议不要这样做,因为它应该是用户选择打开PDF文件时会发生什么。

答案 12 :(得分:1)

我需要为在特定文件夹中使用动态名称创建并由IIS提供的文件执行此操作。

这对我有用:

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

    Name: content-disposition Value: attachment

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

答案 13 :(得分:0)

最后我发现了……创建动态锚标记并单击它

<script> 
   $('#myclick').click(function(){
       $('body').append('<a id="link" href="mypdf.pdf" 
        download="Payment.pdf">&nbsp;</a>');
       $('#link')[0].click();
   });
</script>

“ Payment.pdf”仅用于自定义名称。

答案 14 :(得分:0)

您可以使用download.js(https://github.com/rndme/downloadhttp://danml.com/download.html)。如果文件在外部URL中,则必须发出Ajax请求,但如果不是,则可以使用以下功能:

download(Path, name, mime)

在GitHub上阅读其文档以了解更多详细信息。

答案 15 :(得分:0)

您可以添加以下代码

<a href='http://v2.immo-facile.com/catalog/admin-v2/product_info.pdf' class='btnPdf' title='pdf'  target='_blank' type='application/pdf' >Télécharger la fiche du bien</a>