在JavaScript中,下载文件通常可以通过以下几种方式实现:
<a>
元素你可以创建一个<a>
元素,并使用download
属性来指定文件名称,然后通过编程的方式触发点击事件。
function downloadFile(data, fileName, type="text/plain") {
// 创建一个隐藏的<a>标签
const a = document.createElement("a");
document.body.appendChild(a);
a.style = "display: none";
// 创建blob对象
const blob = new Blob([data], {type: type}),
url = window.URL.createObjectURL(blob);
a.href = url;
a.download = fileName;
a.click();
// 清理
window.URL.revokeObjectURL(url);
document.body.removeChild(a);
}
// 使用函数下载一个文本文件
downloadFile("Hello, world!", "hello.txt");
window.location
如果文件已经存在服务器上,并且你有文件的URL,你可以简单地设置window.location
来下载文件。
function downloadFileByUrl(fileUrl) {
window.location = fileUrl;
}
// 使用函数下载
downloadFileByUrl('http://example.com/file.pdf');
fetch
和FileSaver.js
库对于更复杂的场景,比如需要先用fetch
获取数据然后下载,可以使用FileSaver.js
库。
首先需要在你的项目中引入FileSaver.js
(你可以通过npm安装或直接引入CDN链接)。
然后,使用fetch
获取数据并使用FileSaver
保存文件:
fetch('url-to-fetch-data-from')
.then(resp => resp.blob())
.then(blob => {
const url = window.URL.createObjectURL(blob);
saveAs(url, "filename.ext"); // 使用 FileSaver.js 提供的 saveAs 函数
window.URL.revokeObjectURL(url);
});
如果你控制服务器端的代码,你也可以通过设置HTTP响应头Content-Disposition
来提示浏览器下载文件。
例如,在Node.js中你可以这样做:
response.setHeader('Content-Disposition', 'attachment; filename=filename.ext');
这将告诉浏览器这个响应不应该被正常显示,而是作为一个文件下载到用户的设备上。