Javascript (HTML)下载PDF文件,而不是在单击时在浏览器中打开它们
我想知道如何使PDF文件链接可下载,而不是在浏览器中打开它们?这在html中是如何实现的?(我假设它是通过javascript或其他方式完成的) 行为应取决于浏览器如何设置以处理各种MIME类型。在本例中,MIME类型为application/pdf。如果要强制浏览器下载文件,可以尝试在PDF文件上强制使用其他MIME类型。我建议不要这样做,因为这应该是用户选择当他们打开PDF文件时会发生什么 这只有通过服务器端代码设置http响应头才能实现。即,Javascript (HTML)下载PDF文件,而不是在单击时在浏览器中打开它们,javascript,html,Javascript,Html,我想知道如何使PDF文件链接可下载,而不是在浏览器中打开它们?这在html中是如何实现的?(我假设它是通过javascript或其他方式完成的) 行为应取决于浏览器如何设置以处理各种MIME类型。在本例中,MIME类型为application/pdf。如果要强制浏览器下载文件,可以尝试在PDF文件上强制使用其他MIME类型。我建议不要这样做,因为这应该是用户选择当他们打开PDF文件时会发生什么 这只有通过服务器端代码设置http响应头才能实现。即, Content-Disposition: at
Content-Disposition: attachment; filename=fname.ext
您需要使用PHP脚本(或其他服务器端语言)
您可以使用
Response.AddHeader("Content-disposition", "attachment; filename=" + Name);
看看这个例子:
这适用于ASP.NET。我相信您可以在所有其他服务器端语言中找到类似的解决方案。然而,据我所知,没有javascript解决方案。现在有一个解决方案可以处理这个问题
我同意,并且认为萨里姆的答案是好的(如果OP回来的话,它可能应该是选择的答案)。然而,这一答案仍然是处理这一问题的可靠方法(正如伊奥伊特·耶纳的答案所指出的,奇怪的是,人们也同意这一点)。虽然下载属性获得了支持,但它仍然参差不齐:
最适合我的解决方案是由
他的解决方案的基本思想是使用Apache服务器头mod并编辑.htaccess以包含一个FileMatch指令,该指令强制所有*.pdf文件作为流而不是附件。虽然这实际上并不涉及编辑HTML(根据原始问题),但它本身并不需要任何编程
我喜欢Nick方法的第一个原因是,它允许我对每个文件夹进行设置,这样一个文件夹中的PDF仍然可以在浏览器中打开,同时允许其他文件夹(我们希望用户编辑并重新上传的文件夹)被强制下载
我还想补充一点,PDF有一个选项,可以通过API向服务器发布/提交可填写的表单,但这需要一段时间才能实现
第二个原因是因为时间是一个考虑因素。编写一个PHP文件处理程序来强制在header()中处理内容也比API花费更少的时间,但仍然比Nick的方法要长
如果您知道如何打开Apache mod并编辑.htaccess,您可以在大约10分钟内完成此操作。它需要Linux主机(而不是Windows)。这可能不是适合所有用途的方法,因为它需要高级服务器访问来配置。因此,如果你说访问,可能是因为你已经知道如何做这两件事。如果没有,请查看Nick的博客了解更多说明 有了html5,现在就可以了。在元素中设置“下载”属性
<a href="http://link/to/file" download="FileName">Download it!</a>
来源:我需要对在特定文件夹中使用动态名称创建并由IIS提供服务的文件执行此操作
这对我很有用:
- 在IIS中,转到该文件夹并双击HTTP响应头
- 添加包含以下信息的新标题:
名称:内容处置
值:附件
(from:)如果没有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();
}
如果您使用的是HTML5(我想现在大家都在使用它),那么有一个属性叫做下载
前。
这里的文件名是可选的,但如果提供,下载的文件将使用此名称。因为html5方式(我以前的答案)并不是在所有浏览器中都可用,这里有另一种稍微有点黑客的方式
此解决方案要求您提供来自同一域的预期文件,或具有CORS权限
首先通过XMLHttpRequest(Ajax)下载文件内容
然后通过base64编码文件内容生成一个数据URI,并将媒体类型设置为application/octet-stream
。
结果应该是这样的
数据:应用程序/八位字节流;base64,SGVsbG8sIFdvcmxkIQ%3D%3D
现在设置location.href=data
。这将导致浏览器下载该文件。不幸的是,您不能这样设置文件名或扩展名。摆弄媒体类型可能会产生一些效果
请参阅详细信息:当您想直接从浏览器下载任何图像或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上,它可以在不附加和删除子项的情况下工作您可以使用download.js(和)。如果文件位于外部URL中,则必须发出Ajax请求,但如果不是,则可以使用以下函数:
download(Path, name, mime)
阅读GitHub中的文档以了解更多详细信息。您可以添加以下代码
@Aljohn Yamaro
function forceDownload(pdf_url, pdf_name) {
var x = new XMLHttpRequest();
x.open("GET", pdf_url, true);
x.responseType = 'blob';
x.onload = function(e){
saveAs(x.response, pdf_name, 'application/pdf');
};
x.send();
}
据我所知,这是不可编写脚本的行为。对于下载时如何处理特定文件类型的行为,大多数浏览器都有自己的设置。从HTML5开始,OP应该将正确答案更新为Sarim的答案。这里也回答了这个问题的可能重复:这是答案(以及PHP的相关答案)。关键是http响应头必须被编辑。这是一个完美的答案——只需找到用适当的服务器端语言进行编辑的方法。例子。示例。不幸的是,即使内容配置为“附件”,iOS仍将预览和不下载pdf文件。这只是一个提示,您在使用URL参数执行此操作时需要小心。例如$file=$\u GET['$file']有限公司
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);
download(Path, name, mime)
function forceDownload(pdf_url, pdf_name) {
var x = new XMLHttpRequest();
x.open("GET", pdf_url, true);
x.responseType = 'blob';
x.onload = function(e){
saveAs(x.response, pdf_name, 'application/pdf');
};
x.send();
}