使用Javascript/jQuery下载文件

Mit*_*ran 325 javascript jquery download

在这里指定了非常相似的要求.

我需要让用户的浏览器手动开始下载 $('a#someID').click();

但我无法使用该window.href方法,因为它将当前页面内容替换为您尝试下载的文件.

相反,我想在新窗口/选项卡中打开下载.这怎么可能?

Ran*_*Dev 365

使用不可见的<iframe>:

<iframe id="my_iframe" style="display:none;"></iframe>
<script>
function Download(url) {
    document.getElementById('my_iframe').src = url;
};
</script>
Run Code Online (Sandbox Code Playgroud)

要强制浏览器下载文件,否则它将能够呈现(例如HTML或文本文件),您需要服务器将文件的MIME类型设置为无意义的值,例如application/x-please-download-me或替代地application/octet-stream,用于任意二进制数据.

如果您只想在新选项卡中打开它,唯一的方法是让用户单击其target属性设置为的链接_blank.

在jQuery中:

$('a#someID').attr({target: '_blank', 
                    href  : 'http://localhost/directory/file.pdf'});
Run Code Online (Sandbox Code Playgroud)

只要单击该链接,它就会在新的选项卡/窗口中下载该文件.

  • 不错的片段.然而,设置一个荒谬的事物类型有点令人不安.要让浏览器下载一个可以渲染的文件,请使用以下标题:`Content-Disposition:attachment; filename ="downloaded.pdf"`(您当然可以根据需要自定义文件名). (25认同)
  • 做得很好!很好地解决了这个问题.但是,您可能希望使用:`iframe.style.display ='none';`因为这将完全隐藏iframe.您当前的实现将使iframe不可见,但iframe仍会占用页面底部的空间,从而导致额外的空白区域. (14认同)
  • 网页无法自动打开新标签页.要强制浏览器下载,请让服务器发送带有无意义MIME类型的pdf文件,例如application/x-please-download-me (4认同)
  • @TinoMclaren没有一个愚蠢的问题! (4认同)
  • 它"半"对我有用.我创建了以下简单的测试html:<html> <body> <iframe src ="fileurl"></iframe> </ iframe> </ body> </ html>并且确实下载了,但是在chrome控制台中我看到了下载被"取消"并显示为红色.这是一个更大的移动网络应用程序的一部分,它被取消的事实打破了应用程序,因为它引发了一般的网络故障.有什么方法吗? (2认同)
  • 如何在没有服务器的情况下强制下载?所以只是一个带有一些javascript的html页面. (2认同)
  • 使用无意义的内容类型是一个糟糕的主意。正如 @rixo 几年前所说,正确的方法是“Content-Disposition:attachment”。 (2认同)
  • @Archer该答案写于2016年9月,而此答案写于2010年9月。对该答案的最后编辑是2015年。请在进行此类指责之前做一些尽职调查!!!肯定有窃,但不是我做的! (2认同)
  • 你好,有没有办法在这个 `&lt;iframe&gt;` 中获取 php 响应?我正在使用您的答案将带有参数的 url 发送到 php 文件以下载 zip 文件。我正在阅读 `console.log(iframe)` 以查找“可能的”响应,但直到现在才找到它 (2认同)

Joh*_*ner 174

我已经创建了jQuery文件下载插件(演示)(GitHub),它也可以帮助你的情况.它与iframe的工作方式非常相似,但有一些我发现非常方便的很酷的功能:

  • 很容易设置好的视觉效果(jQuery UI对话,但不是必需的),一切都经过测试

  • 用户永远不会离开他们发起文件下载的同一页面.此功能对于现代Web应用程序变得至关重要

  • successCallback和failCallback函数允许您明确用户在任一情况下看到的内容

  • 结合jQuery UI,开发人员可以轻松地显示一个模式告诉用户文件下载正在发生,在下载开始后解除模式,甚至以友好的方式通知用户发生了错误.有关此示例,请参阅演示.希望这有助于某人!

这是一个使用带有promises 的插件的简单用例演示.该演示页面还包含许多其他"更好的用户体验"示例.

fetch('https://jsonplaceholder.typicode.com/todos/1')
  .then(resp => resp.blob())
  .then(blob => {
    const url = window.URL.createObjectURL(blob);
    const a = document.createElement('a');
    a.style.display = 'none';
    a.href = url;
    // the filename you want
    a.download = 'todo-1.json';
    document.body.appendChild(a);
    a.click();
    window.URL.revokeObjectURL(url);
    alert('your file has downloaded!'); // or you know, something with better UX...
  })
  .catch(() => alert('oh no!'));
Run Code Online (Sandbox Code Playgroud)

  • 在我看来,你这里的现代例子似乎没有多大意义。为什么要通过“fetch”从真实的 HTTPS URL 下载某些内容,从中创建一个 blob,从该 blob 创建一个 blob URL,然后使用带有“download”属性的锚点从该 blob URL 下载(当您可以时)相反,只是...使用带有“download”属性的锚点从您开始使用的 HTTPS URL 下载? (11认同)
  • 你的现代例子不太正确。它将“下载”服务器返回的任何内容。例如,如果您遇到身份验证错误,它将返回登录页面或服务器返回的任何内容,而不是“下载的文件”本身。 (4认同)

小智 127

function downloadURI(uri, name) 
{
    var link = document.createElement("a");
    link.download = name;
    link.href = uri;
    link.click();
}
Run Code Online (Sandbox Code Playgroud)

检查您的目标浏览器是否能顺利运行上述代码段:http:
//caniuse.com/#feat=download

  • 在最新的Firefox浏览器中不起作用 (14认同)
  • 要使它在Firefox上运行,请在单击之前执行`document.body.appendChild(link)`,单击之后可以执行`link.remove()`以避免污染DOM. (9认同)
  • 这不适用于IE:http://www.w3schools.com/tags/att_a_download.asp (7认同)
  • 对我来说,这将是完美的,但它也不适用于Firefox.任何的想法? (7认同)
  • 如 https://caniuse.com/#feat=download 中所述,这仅适用于最近的 Firefox 和 Chrome 版本上的同源链接。因此,如果您的链接指向另一个域,它现在几乎无法在任何地方使用。 (3认同)
  • 当 URL 用于 pdf 或图像文件时,它会打开另一个浏览器窗口并显示文件,但从不下载它们! (2认同)

小智 66

我很惊讶没有很多人知道元素的下载属性.请帮忙宣传它!你可以有一个隐藏的HTML链接,并伪造它点击它.如果html链接具有下载属性,则无论如何都会下载该文件,而不是查看它.这是代码.它会下载猫图片,如果它能找到它.

document.getElementById('download').click();
Run Code Online (Sandbox Code Playgroud)
<a href="https://docs.google.com/uc?id=0B0jH18Lft7ypSmRjdWg1c082Y2M" download id="download" hidden></a>
Run Code Online (Sandbox Code Playgroud)

注意:并非所有浏览器都支持此功能:http://www.w3schools.com/tags/att_a_download.asp

  • IE和Safari不支持 (11认同)
  • Chrome下载,但Firefox只显示图片. (9认同)
  • 最新的 Chrome(2018 年 8 月)也显示图片(由于荒谬的安全限制)所以失败 (4认同)

Lau*_*hes 47

我建议使用html5代替jQuery下载:

<a href="your_link" download> file_name </a>
Run Code Online (Sandbox Code Playgroud)

这将下载您的文件,而无需打开它.

  • 在我看来,这是问题的正确答案.如果您必须支持旧版浏览器并需要解决方法,其他答案才有意义. (7认同)
  • 它只支持Chrome,Firefox,Opera和IE(> = 13.0) (4认同)
  • 但是如果我们需要通过链接传递有效负载怎么办? (3认同)

cor*_*cho 20

如果您已经在使用jQuery,那么您可以使用jQuery来生成一个较小的片段
一个jQuery版本的Andrew的答案:

var $idown;  // Keep it outside of the function, so it's initialized once.
downloadURL : function(url) {
  if ($idown) {
    $idown.attr('src',url);
  } else {
    $idown = $('<iframe>', { id:'idown', src:url }).hide().appendTo('body');
  }
},
//... How to use it:
downloadURL('http://whatever.com/file.pdf');
Run Code Online (Sandbox Code Playgroud)

  • `if`语句应该是:`if($ idown && $ idown.length> 0)` (6认同)
  • Chrome中没有任何功能 (3认同)

EL *_*bib 12

适用于Chrome,Firefox和IE8及更高版本.

var link=document.createElement('a');
document.body.appendChild(link);
link.href=url ;
link.click();
Run Code Online (Sandbox Code Playgroud)

  • 如果您不将链接附加到 DOM,这也适用。 (2认同)

Aar*_*ier 10

使用一个简单的例子 iframe

function downloadURL(url) {
    var hiddenIFrameID = 'hiddenDownloader',
        iframe = document.getElementById(hiddenIFrameID);
    if (iframe === null) {
        iframe = document.createElement('iframe');
        iframe.id = hiddenIFrameID;
        iframe.style.display = 'none';
        document.body.appendChild(iframe);
    }
    iframe.src = url;
};
Run Code Online (Sandbox Code Playgroud)

然后只需在任何地方调用函数:

downloadURL('path/to/my/file');

  • 下载代码在哪里?您只需添加一个 iframe (2认同)

rak*_*oof 10

仅仅七年之后,这里出现了一个使用表单而不是iframe或链接的单行jQuery解决方案:

$('<form></form>')
     .attr('action', filePath)
     .appendTo('body').submit().remove();
Run Code Online (Sandbox Code Playgroud)

我已经测试了这个

  • Chrome 55
  • Firefox 50
  • Edge IE8-10
  • iOS 10(Safari/Chrome)
  • Android Chrome

如果有人知道这个解决方案的任何缺点,我会很高兴听到他们.


完整演示:

<html>
<head><script src="https://code.jquery.com/jquery-1.11.3.js"></script></head>
<body>
<script>
    var filePath = window.prompt("Enter a file URL","http://jqueryui.com/resources/download/jquery-ui-1.12.1.zip");
    $('<form></form>').attr('action', filePath).appendTo('body').submit().remove();
</script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

  • 如果你的`filePath`有一个查询字符串,这不起作用,因为提交表单会覆盖action属性中的查询字符串. (7认同)
  • 这看起来是一种将 `window.location` 设置为 `filePath` 的非常复杂的方法。只是`window.location = filePath;` 会做同样的事情。 (2认同)

Abk*_*Abk 9

我最终使用了下面的代码片段,它适用于大多数浏览器,但未在 IE 中进行测试。

let data = JSON.stringify([{email: "test@domain.com", name: "test"}, {email: "anothertest@example.com", name: "anothertest"}]);

let type = "application/json", name = "testfile.json";
downloader(data, type, name)

function downloader(data, type, name) {
	let blob = new Blob([data], {type});
	let url = window.URL.createObjectURL(blob);
	downloadURI(url, name);
	window.URL.revokeObjectURL(url);
}

function downloadURI(uri, name) {
    let link = document.createElement("a");
    link.download = name;
    link.href = uri;
    link.click();
}
Run Code Online (Sandbox Code Playgroud)

更新

function downloadURI(uri, name) {
    let link = document.createElement("a");
    link.download = name;
    link.href = uri;
    link.click();
}

function downloader(data, type, name) {
    let blob = new Blob([data], {type});
    let url = window.URL.createObjectURL(blob);
    downloadURI(url, name);
    window.URL.revokeObjectURL(url);
}
Run Code Online (Sandbox Code Playgroud)


Roh*_*rte 7

如果不需要浏览其他页面,这可能会有所帮助。这是基本的javascript函数,因此可以在Javascript后端的任何平台中使用

window.location.assign('any url or file path')
Run Code Online (Sandbox Code Playgroud)


Eva*_* MJ 6

您可以简单地使用 HTML 中的 Download 属性。使用好的 ol' Javascript,您可以使用此功能直接下载文件。锚标记的下载属性应指向要下载的文件所在的链接。

首先,将 URL 指向您的资源路径:

var url = 'your url goes here';
Run Code Online (Sandbox Code Playgroud)

创建一个锚标记,所需属性如下:

var elem = document.createElement('a');
elem.href = url;
elem.download = url;
elem.id="downloadAnchor";
Run Code Online (Sandbox Code Playgroud)

将锚标记附加到网页的正文元素。

document.body.appendChild(elem);
Run Code Online (Sandbox Code Playgroud)

现在以编程方式触发单击事件。单击锚标记将触发下载。

$('#downloadAnchor').click();
Run Code Online (Sandbox Code Playgroud)

把它们放在一起:

var url = 'your url goes here';
var elem = document.createElement('a');
elem.href = url;
elem.download = url;
elem.id="downloadAnchor";
document.body.appendChild(elem);
$('#downloadAnchor').click();
Run Code Online (Sandbox Code Playgroud)

附加信息:上面的代码没有什么特别的,只是客户端 JavaScript,它可以在 Chrome Devtools 的控制台上运行,但是功能强大,并且还提供了很多可能性,例如网页抓取。

例如,在 Devtools 控制台中执行的以下代码块将在新选项卡中打开页面中的所有链接:只需转到此网页,打开 devtools 并在浏览器控制台中运行此脚本,然后观看 JavaScript 的强大功能。(注:以下代码纯粹用于教育目的。)

确保为该站点启用弹出窗口,否则默认的弹出窗口阻止程序将禁用您的锚点点击。

var links = document.getElementsByClassName("_3ATBKe");
for(var i=0;i<links.length;i++){
    var title = document.getElementsByClassName("_3ATBKe")[i].firstElementChild.firstElementChild.innerText.replaceAll('|','-').replaceAll(':','x');
    console.log('Opening..'+title);
    links[i].firstElementChild.click();
}
Run Code Online (Sandbox Code Playgroud)

注意:这不仅限于锚点点击,您几乎可以下载网页上找到的任何内容。如果某些内容(图像、音频、视频)加载到您的网页上,您可能可以编写一个脚本来下载它,即使 UI 没有提供该内容。


Ita*_*rra 6

我专门为这种情况创建了一个 npm 包(是的,这是我的包,但它非常适合您的情况,所以我很乐意在这里提及它)。
你可以检查一下,看看你是否喜欢它。它称为fs-browsers,并为客户端提供了良好且简单的下载方法。
事情是这样的:

import { downloadFile } from 'fs-browsers';
downloadFile(url-to-the-file);
Run Code Online (Sandbox Code Playgroud)


Mac*_*zyk 5

我不知道这个问题是不是太老了,但是只要下载 mime 类型正确(例如 zip 存档),将 window.location 设置为下载 url 就可以了。

var download = function(downloadURL) {

   location = downloadURL;

});

download('http://example.com/archive.zip'); //correct usage
download('http://example.com/page.html'); //DON'T
Run Code Online (Sandbox Code Playgroud)


Gas*_*ass 5

如果您正在寻找描述性的 TypeScript 方法,请查看:

  1. 创建一个斑点
  2. 使用blob创建 URL
  3. 创建一个隐藏元素,单击该元素即可下载文件
  4. 使脚本单击超链接 HTML 元素
  5. 空闲内存
function download(content: string, fileName: string) {

  const 
      blob = new Blob([content], { type: /* some type */ }),
      urlForDownload = window.URL.createObjectURL(blob),
      const linkElement = document.createElement('a'); // create hyperlink HTML element

  linkElement.href = urlForDownload
  linkElement.download = fileName
  linkElement.click()

  URL.revokeObjectURL(urlForDownload) // free memory
}
Run Code Online (Sandbox Code Playgroud)

等等..但是什么是斑点?

Blob 对象代表一个 blob,它是不可变的原始数据的类似文件的对象;它们可以作为文本或二进制数据读取,或者转换为 ReadableStream,以便其方法可用于处理数据。

Blob 可以表示不一定是 JavaScript 原生格式的数据。File接口基于Blob,继承了blob功能并将其扩展以支持用户系统上的文件。