【问题标题】:Force download a pdf link using javascript/ajax/jquery使用 javascript/ajax/jquery 强制下载 pdf 链接
【发布时间】:2010-06-19 21:09:50
【问题描述】:

假设我们有一个 pdf 链接“http://manuals.info.apple.com/en/iphone_user_guide.pdf”(例如,让您知道该文件不在我的服务器上,我只有链接)...现在我必须在我的网站上提供一个按钮这将下载文件。

我尝试过各种方法,例如 window.open、href 等方法,但它会在其他窗口上打开链接。我知道那是因为现在所有浏览器都带有一个 adobe 插件,可以在另一个窗口中打开它,但我仍然没有任何方法可以让用户选择下载而不是打开它,通过客户端脚本..

请帮助.. 谢谢

【问题讨论】:

标签: javascript


【解决方案1】:

这是一个 Javascript 解决方案(适合像我这样正在寻找标题答案的人):

function SaveToDisk(fileURL, fileName) {
    // for non-IE
    if (!window.ActiveXObject) {
        var save = document.createElement('a');
        save.href = fileURL;
        save.target = '_blank';
        save.download = fileName || 'unknown';

        var evt = new MouseEvent('click', {
            'view': window,
            'bubbles': true,
            'cancelable': false
        });
        save.dispatchEvent(evt);

        (window.URL || window.webkitURL).revokeObjectURL(save.href);
    }

    // for IE < 11
    else if ( !! window.ActiveXObject && document.execCommand)     {
        var _window = window.open(fileURL, '_blank');
        _window.document.close();
        _window.document.execCommand('SaveAs', true, fileName || fileURL)
        _window.close();
    }
}

来源:http://muaz-khan.blogspot.fr/2012/10/save-files-on-disk-using-javascript-or.html

不幸的是,这不适用于 IE11,它不接受新的 MouseEvent。在这种情况下,我使用以下内容:

//...
try {
    var evt = new MouseEvent(...);
} catch (e) {
    window.open(fileURL, fileName);
}
//...

【讨论】:

  • error failed no file
  • 感谢您的方法。它将文件保存为“未知”我将其更改为 fileURL 将其保存为“http---localhost-ielts/gtreading-workbook-Activity_3_1.pdf”知道如何修复它吗?
  • @Dino 这段代码绝对应该被 wiki 编辑、增强和定期集体更新,以应对技术更新。但我不知道如何在 SO 上实现这个乌托邦目标 :)
【解决方案2】:

使用 HTML5“下载”属性

<a href="iphone_user_guide.pdf" download="iPhone User's Guide.PDF">click me</a>

2021 年更新:现在所有主流浏览器都支持!见:caniuse.com/#search=download

如果您需要支持旧版浏览器,或者您正在寻找实际 javascript 解决方案(出于某种原因),请参阅lajarre's answer

【讨论】:

  • 这对 HTML4 有什么帮助?还有其他方法吗?
  • 嗨,我使用了相同的代码,但该代码在 safari 中不起作用,你能推荐我任何允许在 javascript 中强制下载 pdf 文件的好插件吗?
  • 根据 caniuse caniuse.com/#search=download 这目前在 safari 中不受支持。我只是在猜测,但您也许可以使用 jquery.ajax 的contentType 来实现这一点。否则,如果您可以控制服务器,当然可以告诉它使用二进制 mime 类型发送文件。
  • 这没有回答确切的问题
  • OP 对我来说并不重要(恕我直言)。此页面作为第一个结果出现在 Google 中,但没有回答我的查询,这与标题完全相同。不明白的请参考我的回答。
【解决方案3】:

对于 JavaScript,即使不是不可能,也是非常困难的(?)。我建议使用某种代码隐藏语言,例如 PHP、C# 或 Java。如果您要使用 PHP,您可以在按钮发布到的页面中执行以下操作:

<?php
header('Content-type: application/pdf');
header('Content-disposition: attachment; filename=filename.pdf');
readfile("http://manuals.info.apple.com/en/iphone_user_guide.pdf");
?>

这似乎也适用于 JS(来自http://www.phpbuilder.com/board/showthread.php?t=10149735):

<body>
<script>
function downloadme(x){
myTempWindow = window.open(x,'','left=10000,screenX=10000');
myTempWindow.document.execCommand('SaveAs','null','download.pdf');
myTempWindow.close();
}
</script>

<a href=javascript:downloadme('http://manuals.info.apple.com/en/iphone_user_guide.pdf');>Download this pdf</a>
</body>

【讨论】:

    【解决方案4】:

    Here 是使用 javaScript 下载文件的完美示例。

    用法:download_file(fileURL, fileName);

    【讨论】:

      【解决方案5】:

      如果 htaccess 是一个选项,这将使所有 PDF 链接下载而不是在浏览器中打开

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

      【讨论】:

        【解决方案6】:

        在 javascript 中使用 event args 参数的 preventDefault() 方法。

        <a href="no-script.html">Download now!</a>
        
        $('a').click(function(e) {
            e.preventDefault(); // stop the browser from following
            window.location.href = 'downloads/file.pdf';
        });
        

        【讨论】:

          【解决方案7】:

          使用Javascript,您可以通过简单的方法像这样下载

          var oReq = new XMLHttpRequest();
          // The Endpoint of your server 
          var URLToPDF = "https://mozilla.github.io/pdf.js/web/compressed.tracemonkey-pldi-09.pdf";
          // Configure XMLHttpRequest
          oReq.open("GET", URLToPDF, true);
          
          // Important to use the blob response type
          oReq.responseType = "blob";
          
          // When the file request finishes
          // Is up to you, the configuration for error events etc.
          oReq.onload = function() {
          // Once the file is downloaded, open a new window with the PDF
          // Remember to allow the POP-UPS in your browser
          var file = new Blob([oReq.response], { 
              type: 'application/pdf' 
          });
          
          // Generate file download directly in the browser !
          saveAs(file, "mypdffilename.pdf");
          };
          
          oReq.send();
          

          【讨论】:

          • saveAs 来自哪里?
          猜你喜欢
          • 1970-01-01
          • 2010-12-15
          • 2012-02-23
          • 2012-05-21
          • 2016-04-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多