后端:
javapublic void batchDownload(List<User> list, HttpServletResponse response) { if (list==null || list.size()<=0) { throw new ServiceException("请选择要下载的文件"); } try { // 创建临时压缩文件 String tempFileName = "批量下载_" + System.currentTimeMillis() + ".zip"; File tempFile = File.createTempFile("temp_", ".zip"); try (ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(tempFile))) { for (User user : list) { if (user.getKhcl()!=null) { String filePath = basePath + user.getKhcl().getFilePath(); File file = new File(filePath); if (file.exists()) { ZipEntry zipEntry = new ZipEntry(user.getKhcl().getFileName()); zipOut.putNextEntry(zipEntry); Files.copy(file.toPath(), zipOut); zipOut.closeEntry(); } } } } // 设置响应头 response.setContentType("application/zip"); response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(tempFileName, "UTF-8")); // 发送文件 Files.copy(tempFile.toPath(), response.getOutputStream()); // 删除临时文件 tempFile.delete(); } catch (IOException e) { System.out.println(Arrays.toString(e.getStackTrace())); throw new ServiceException("批量下载失败:"+e.getMessage()); }
前端:
javascript
export function batchDownload(data) {
return request({
url: '/system/user/batchDownload',
method: 'post',
data: data,
responseType: 'blob', // 关键:指定响应类型为blob
headers: {
'Content-Type': 'application/json'
}
})
}
h5:
javascript
// 使用XMLHttpRequest替代$.ajax,以便正确处理二进制数据
var xhr = new XMLHttpRequest();
xhr.open('POST', prefix + '/batchDownload', true);
xhr.setRequestHeader('Content-Type', 'application/json;charset=UTF-8');
xhr.responseType = 'blob'; // 重要:设置响应类型为blob
xhr.onload = function() {
$.modal.closeLoading();
if (xhr.status === 200) {
// 从响应头获取文件名
var contentDisposition = xhr.getResponseHeader('Content-Disposition');
var filename = "批量下载文件.zip";
if (contentDisposition) {
var filenameMatch = contentDisposition.match(/filename="?(.+)"?/i);
if (filenameMatch && filenameMatch.length > 1) {
filename = decodeURIComponent(filenameMatch[1]);
}
}
// 创建Blob对象
var blob = new Blob([xhr.response], {type: 'application/zip'});
// 创建下载链接
if (window.navigator && window.navigator.msSaveOrOpenBlob) {
// IE浏览器
window.navigator.msSaveOrOpenBlob(blob, filename);
} else {
// 其他浏览器
var url = window.URL.createObjectURL(blob);
var a = document.createElement('a');
a.href = url;
a.download = filename;
document.body.appendChild(a);
a.click();
// 清理
setTimeout(function() {
document.body.removeChild(a);
window.URL.revokeObjectURL(url);
}, 100);
}
$.modal.msgSuccess("下载成功");
} else {
// 尝试解析错误消息
var reader = new FileReader();
reader.onload = function() {
try {
var errorResponse = JSON.parse(reader.result);
$.modal.alertError("下载失败:" + (errorResponse.msg || errorResponse.message || "未知错误"));
} catch (e) {
$.modal.alertError("下载失败,状态码:" + xhr.status);
}
};
reader.readAsText(xhr.response);
}
};
xhr.onerror = function() {
$.modal.closeLoading();
$.modal.alertError("下载请求失败,请检查网络连接");
};
xhr.send(JSON.stringify(list));