前端实现多文件下载功能的思路与代码分享

73万字的Java面试题库【全网最详细-找工作/实习必备神器】

https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzE5MTY1NzczOA==&action=getalbum&album_id=4057608455186808839
Java面试题库ps:网上面试题多而杂,自己整理了一套面试题,我靠这套面试题 2年经验拿15k~

前端实现多文件下载功能的思路与代码分享

在前端开发中,我们时常会遇到文件下载的需求,尤其是多文件下载场景。今天就来分享一下如何在前端实现多文件分开下载的功能,同时对涉及的代码进行合理脱敏,方便大家理解核心逻辑 。

一、需求背景

假设我们从后端获取到一组文件的元数据,以 JSON 格式呈现,里面包含每个文件的唯一标识 fileId、文件名、大小等信息。我们需要基于这些信息,实现逐个文件的下载操作,让浏览器分别发起下载请求,把每个文件单独下载下来。

二、核心思路

1. 单个文件下载原理

对于单个文件下载,我们可以直接利用 location.href ,通过构造包含文件标识和权限令牌(这里以 accessToken 为例)的下载链接,让浏览器发起 GET 请求去下载文件。像这样:

// 单个文件下载示例
location.href = "/sysFile/download/" + fileId + "?accessToken=" + accessToken;

不过这种方式在循环里直接用的话,因为浏览器的请求机制,会导致只能下载最后一个文件,无法实现多文件依次下载,所以多文件下载需要换一种方式。

2. 多文件下载方案

为了实现多文件分开下载,我们可以动态创建  标签,给每个标签设置好对应的下载链接和文件名,然后模拟点击这些  标签,让浏览器逐个发起下载请求。这样就能实现多文件的分开下载啦。

三、脱敏后的代码实现

以下是经过脱敏处理后的多文件下载函数代码,方便大家学习核心逻辑,实际使用时可根据项目真实的接口、参数等进行调整:

// files 是包含文件元数据的 JSON 数组,accessToken 是用于权限验证的令牌
function downloadFiles(files, accessToken) {
    // 遍历文件元数据数组
    for (let i = 0; i < files.length; i++) {
        const fileInfo = files[i];
        const fileId = fileInfo.fileId;
        // 构造文件下载链接,拼接 accessToken 等参数
        const downloadUrl = `/sysFile/download/${fileId}?accessToken=${accessToken}`; 
        // 创建  标签
        const link = document.createElement("a"); 
        link.href = downloadUrl;
        // 设置下载时的文件名,这里简单用 file 加索引,实际可优化为文件真实名称
        link.download = `file_${i + 1}.zip`; 
        // 模拟点击  标签,触发下载
        link.click(); 
    }
}

// 单个文件下载函数示例(脱敏后)
function downloadSingleFile(fileId, accessToken) {
    location.href = `/sysFile/download/${fileId}?accessToken=${accessToken}`;
}

代码说明

四、拓展与优化思考

  1. 文件名优化:当前多文件下载里给的文件名是简单拼接的,实际可以从 files 数组里的 fileName 字段获取真实文件名,让下载的文件名称更有意义,比如把 link.download = fileInfo.fileName; 。
  2. 错误处理:代码里没有对下载过程中的错误进行处理,比如网络问题导致下载失败等情况。可以给  标签添加 onerror 事件监听,在下载出错时给出提示或者执行其他补救逻辑。
  3. 并发控制:如果文件数量特别多,频繁创建  标签模拟点击可能会对浏览器造成一定压力。可以考虑做并发控制,比如一次最多同时下载几个文件,避免浏览器请求过多出现异常。

 

你可能感兴趣的:(技术开发,java,开发语言)