请教一下后端根据前端传入的编号数组然后到指定文件夹找到对应的文件然后压缩成压缩包返回前端下载该怎么写呀。
这里是我的一个后端接口部分代码,然后我想在这里调用比方说一个压缩工具类,压缩指定文件之后返回前端下载。
// 根据证书编号压缩定义文件返回前端
@PostMapping("/batch/download")
public Result batchDownload(String[] certificateNumbers) {
// 对上传的数据进行校验
if (certificateNumbers == null || certificateNumbers.length == 0) {
return Result.error("证书编号不能为空");
}
return Result.success("文件下载成功");
}
方法返回类型是我自定义的一个Result类,具体代码如下:
//响应结果封装类
public class Result<T> {
// 业务状态码 200成功 500失败
private Integer code;
// 提示信息
private String message;
// 返回响应数据
private T data;
// 携带响应数据快速返回成功响应结果
public static <E> Result<E> success(E data) {
return new Result<>(200, "操作成功", data);
}
// 重载方法 快速返回成功响应结果 无响应数据
public static Result success() {
return new Result(200, "操作成功", null);
}
// 快速返回失败响应结果
public static Result error(String message) {
return new Result(500, message, null);
}
// 携带响应数据快速返回失败响应结果
public static Result error(String message, Object data) {
return new Result(500, message, data);
}
前端部分我写了一个响应拦截器 对应我返回的信息 代码如下:
instance.interceptors.response.use(
// 当响应成功时触发的回调函数
result => {
// 判断业务状态码,通常情况下,200 表示请求成功
if (result.data.code === 200) {
// 直接返回响应体中的数据,以便后续的.then链能够继续处理
return result.data;
}
// 如果业务状态码不是200,表示操作失败
// 错误信息优先使用服务器返回的message,若服务器未提供,则默认提示“服务异常”
ElMessage.error(result.data.message ? result.data.message : '服务异常');
// 将Promise状态标记为rejected,使得外部可以统一处理这类失败情况
return Promise.reject(result.data);
},
Vue的代码我用的axios我自己写了一个请求工具然后在别的地方调用这个工具
// 导出一个名为exportQrCodeService的异步函数,用于处理导出二维码的请求及文件下载逻辑
export const exportQrCodeService = async (data) => {
// 发起一个POST请求到'/batch/download'端点,用于下载数据
// 请求配置包括:
// - data: 传递给服务器的数据,用于生成或识别要下载的二维码内容
// - withCredentials: 设置为true,允许跨域请求携带凭证(如cookies)
// - responseType: 设置响应类型为'blob',这样可以处理二进制数据,适用于文件下载
return request({
url: '/batch/download',
method: 'post',
data: data,
withCredentials: true,
responseType: 'blob',
})
// 当请求成功时执行的处理逻辑
.then((response) => {
// 打印请求响应
console.log(response);
// 使用URL.createObjectURL方法创建一个指向新Blob对象的URL,Blob对象包含了从服务器返回的二进制数据
const url = window.URL.createObjectURL(new Blob([response.data]));
// 创建一个新的HTML <a> 元素,用于模拟下载链接
const link = document.createElement('a');
// 设置<a>元素的href属性为刚创建的URL,指向要下载的文件数据
link.href = url;
// 设置下载属性,指定下载文件的名称为'files.zip'
link.setAttribute('download', 'files.zip');
// 将创建的<a>元素临时添加到文档中,以便能触发点击事件
document.body.appendChild(link);
// 触发模拟的点击事件,开始下载文件
link.click();
// 下载完成后从文档中移除这个临时的<a>元素
link.remove();
})
// 如果请求过程中出现错误,则捕获错误并打印到控制台
.catch((error) => {
console.error('Error downloading file:', error);
// 重新抛出错误,以便在调用此函数的地方可以进一步处理错误
throw error;
}) // 添加finally块以确保资源被清理
.finally(() => {
// 清理URL对象以释放资源
window.URL.revokeObjectURL(url);
});
};
我的代码写的比较烂,如果要改动的话,动的地方有点多,然后这个功能属实是不知道怎么开发了。有劳请基于我给出的代码提供完整解决方案。