我想知道如何将PDF文件链接下载而不是在浏览器中打开它们?这是如何在HTML中完成的? (我假设它是通过javascript或其他方式完成的)。
答案 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的回答指出的那样 - 奇怪的是 - 人们同意)。虽然下载属性获得了支持,但它仍然不稳定:
答案 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权限。
application/octet-stream
。
结果应该看起来像 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提供的文件执行此操作。
这对我有用:
使用以下信息添加新标头:
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"> </a>');
$('#link')[0].click();
});
</script>
“ Payment.pdf”仅用于自定义名称。
答案 14 :(得分:0)
您可以使用download.js(https://github.com/rndme/download和http://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>