我想知道如何使PDF文件链接可下载,而不是在浏览器中打开它们?如何在html中完成?(我认为这是通过javascript或其他方式完成的)。
我想知道如何使PDF文件链接可下载,而不是在浏览器中打开它们?如何在html中完成?(我认为这是通过javascript或其他方式完成的)。
Answers:
您无法使用HTML执行此操作。这是基于服务器的解决方案。您必须流式传输文件,以便浏览器触发保存对话框。
我建议不要这样做。用户如何与PDF交互应由用户决定。
更新(2014):
所以...这个答案仍然有很多不足之处。我认为部分原因是4年前已经回答过,正如Sarim指出的那样,现在有HTML 5 download属性可以处理此问题。
我同意,并且认为Sarim的答案很好(如果OP回来的话,应该是选择的答案)。但是,此答案仍然是处理该问题的可靠方法(正如YiğitYener的答案指出的,而且-令人感到奇怪-人们对此表示赞同)。尽管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
if ("download" in document.createElement("a")){ ... }
您将需要使用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
http://www.example.com/_PDFs/___download_the_catalogue_instead_opening.php并尝试打开pdf文件,它仍然会在浏览器中打开原始文件,而不是下载重命名的版本...
您可以使用
Response.AddHeader("Content-disposition", "attachment; filename=" + Name);
看看这个例子:
http://www.codeproject.com/KB/aspnet/textfile.aspx
这适用于ASP.NET。我相信您可以在所有其他服务器端语言中找到类似的解决方案。但是,就我所知,还没有JavaScript解决方案。
没有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>
$file = $_GET['$file'];。因为然后一个人也可以呼叫download.php?file=../../../wp-config.php或其他任何给定资源。额外检查扩展名,MIME类型和允许的下载路径(并剥离“ ../”之类的东西)非常重要!
<a href='download.php'> ?
当您想直接从浏览器下载任何图像或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上,无需附加和删除子项即可使用
最适合我的解决方案是Nick在他的博客上撰写的解决方案
他的解决方案的基本思想是使用Apache服务器标头mod并编辑.htaccess以包含FileMatch指令,该指令强制所有* .pdf文件充当流而不是附件。尽管这实际上并不涉及编辑HTML(按照原始问题),但它本身不需要任何编程。
我喜欢Nick的方法的第一个原因是因为它允许我基于每个文件夹进行设置,因此仍可以在浏览器中打开一个文件夹中的PDF,同时允许其他文件夹(我们希望用户编辑然后重新上传的PDF)被迫下载。
我还想补充一点,PDF有一个选项,可以通过API向您的服务器发布/提交可填写的表单,但这需要一段时间才能实现。
第二个原因是因为时间是考虑因素。编写PHP文件处理程序以强制header()中的内容处理也将比API花费更少的时间,但仍比Nick的方法花费更长的时间。
如果您知道如何打开Apache mod并编辑.htaccss,则可以在大约10分钟内获得此信息。它需要Linux托管(不是Windows)。这可能不适用于所有用途,因为它需要高级服务器访问权限才能进行配置。因此,如果您说过访问权限,可能是因为您已经知道如何做这两件事。如果没有,请查看Nick的博客以获取更多说明。
由于html5方式(我以前的回答)并非在所有浏览器中都可用,因此这是另一种稍微有点破解的方式。
此解决方案要求您从同一域提供预期的文件,或者具有CORS权限。
application/octet-stream。结果应该看起来像data:application/octet-stream;base64,SGVsbG8sIFdvcmxkIQ%3D%3D
现在设置location.href = data。这将导致浏览器下载文件。不幸的是,您不能通过这种方式设置文件名或扩展名。摆弄媒体类型可能会产生一些效果。
查看详细信息:https : //developer.mozilla.org/zh-CN/docs/Web/HTTP/data_URIs
我需要对在特定文件夹中使用动态名称创建并由IIS服务的文件执行此操作。
这对我有用:
添加具有以下信息的新标题:
Name: content-disposition
Value: attachment
(摘自:http : //forums.iis.net/t/1175103.aspx?add+CustomHeaders+only+for+certain+file+types+)
如果您使用的是HTML5(我想现在每个人都在使用HTML5),则有一个名为的属性download。
例如
<a href="somepathto.pdf" download="filename">
这filename是可选的,但如果提供的话,它将以此名称表示下载的文件。
<a href="download/Curriculum_it.pdf.zip">Download curriculum</a>或那个:<a href="download/Curriculum_it.pdf.zip" download="Curriculum_it">Download curriculum</a>我绝对看不出它的工作原理有什么不同。都下载我的.zip。在第二个文件中,使用filename选项似乎根本不起作用。
行为应取决于如何设置浏览器以处理各种MIME类型。在这种情况下,MIME类型为application / pdf。如果要强制浏览器下载文件,可以尝试在PDF文件上强制使用其他MIME类型。我建议不要这样做,因为用户应该选择打开PDF文件时会发生什么。
您可以使用download.js(https://github.com/rndme/download和http://danml.com/download.html)。如果文件在外部URL中,则必须发出Ajax请求,但如果不是,则可以使用以下功能:
download(Path, name, mime)
在GitHub中阅读其文档以获取更多详细信息。