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

Javascript (HTML)下载PDF文件,而不是在单击时在浏览器中打开它们,javascript,html,Javascript,Html,我想知道如何使PDF文件链接可下载,而不是在浏览器中打开它们?这在html中是如何实现的?(我假设它是通过javascript或其他方式完成的) 行为应取决于浏览器如何设置以处理各种MIME类型。在本例中,MIME类型为application/pdf。如果要强制浏览器下载文件,可以尝试在PDF文件上强制使用其他MIME类型。我建议不要这样做,因为这应该是用户选择当他们打开PDF文件时会发生什么 这只有通过服务器端代码设置http响应头才能实现。即, Content-Disposition: at

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

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

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

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();
    }