前端下载多个文件/浏览器批量下载文件

背景

使用以下简单的下载方法时,会发现只有第一个文件被下载了,而且没有任何提示。

用的Edge,使用以下方法下载多个文件没有任何提示。

如果用过alist,会发现那里面的批量下载也是个残废功能。

后续的方法主要是针对于没有提示的问题。

js 复制代码
const a = document.createElement('a')
a.href = url
a.download = filename  // 指定文件名
document.body.appendChild(a)
a.click()
document.body.removeChild(a)

原因

浏览器出于安全或用户体验限制,阻止了"非用户直接触发"的多次自动下载。

单次click对应一次下载,浏览器发现你只点了一次按钮,却触发多次下载,于是阻止。

尤其是使用如上简单代码下载时,居然连提示都没有跳出来。

解决

任何一种解决办法都需要用户在浏览器上允许下载多个文件,除非你把多个文件打成压缩包,避开这个问题。

直接下载

通过setTimeout可以触发浏览器下载多个文件的提示。

不跳出下载多文件的提示不是我瞎说的,我遇到这种情况很多次,下面的这种延时下载可以绕过这个问题。

如果在100ms以内,依然只下载一个文件。(我没详细测过,200是可以的) 当不使用setTimeout时,会使得浏览器完全不跳出多文件下载的提示,导致用户不会授权 最终后果就是只下载第一个文件

js 复制代码
setTimeout(() => {
  const a = document.createElement('a')
  a.href = url  // 直接使用原始URL,而非Blob URL
  a.download = filename  // 指定文件名
  document.body.appendChild(a)
  a.click()
  document.body.removeChild(a)
}, timeout)
timeout += 200

所有文件都开始下载后,应该清空timeout。

fetch + Blob(推荐)

优点:对于跨域资源,也能够实现自定义命名。

这种方式的主要缺点在于用户无法看到下载的进度条,因为没有调用浏览器的下载器进行下载 或者说需要手动实现下载进度显示功能

js 复制代码
fetch(url)
  .then(res => res.blob())
  .then(blob => {
    const url = URL.createObjectURL(blob);
    const a = document.createElement('a');
    a.href = url;
    a.download = filename; // ✅ 生效!因为是 Blob URL
    a.click();
    URL.revokeObjectURL(url);
    document.body.removeChild(a)
  });
相关推荐
恋猫de小郭1 分钟前
Flutter 凉了没?Flutter 2026 的未来行程和规划,一些有趣的变化
android·前端·flutter
Beginner x_u4 分钟前
前端手动实现大文件分片上传调度层:分片计算、并发上传与断点续传
前端·状态模式·断点续传·大文件分片上传
胖纳特8 分钟前
Nextcloud 文件预览困局与破局:集成 BaseMetas Fileview 实现全格式在线预览
前端·后端
一个心烑8 分钟前
Layui结合springboot读取返回值,前端展示简单示例
前端·spring boot·layui
天天向上10249 分钟前
openlayers 加载Shapefile文件
前端·javascript·html
亿元程序员12 分钟前
手工拼豆有风险?手把手教你开发个电子版的
前端
hhhhhh_we15 分钟前
再定义“皮肤人格”:从Baumann 16型分型到预颜美历的AI时序人格
前端·图像处理·人工智能·python·aigc
鹏程十八少16 分钟前
10. 2026金三银四 Android 组件化 & ARouter 面试杀手锏:33 道高频题 + 答案 + 流程图 + 源码,资深工程师必刷
前端·后端·面试
yqcoder17 分钟前
CSS 布局双雄:浮动 (Float) vs 绝对定位 (Absolute) 深度解析
前端·css
朝阳3922 分钟前
react【实战】首页 -- 白天/黑夜主题切换(含组件封装)
前端·react.js·前端框架