SpringBoot文件下载(多文件以zip形式,单文件格式不变)
初始化文件服务器(我的是minio)
private static MinioClient minioClient = null;
private static String BUCKETNAME;
public void init() {
String endpoint = "endpoint";
int port = 9000;
String accessKey = "accessKey";
String secretKey = "secretKey";
boolean secure = false;
try {
minioClient = new MinioClient(endpoint, port, accessKey, secretKey, secure);
if (!minioClient.bucketExists(BUCKETNAME)) {
minioClient.makeBucket(BUCKETNAME);
String config = "{\"Statement\":[{\"Action\":[\"s3:GetBucketLocation\",\"s3:ListBucket\"],\"Effect\":\"Allow\",\"Principal\":\"*\",\"Resource\":\"arn:aws:s3:::" + BUCKETNAME + "\"},{\"Action\":\"s3:GetObject\",\"Effect\":\"Allow\",\"Principal\":\"*\",\"Resource\":\"arn:aws:s3:::" + BUCKETNAME + "/*\"}],\"Version\":\"2012-10-17\"}";
minioClient.setBucketPolicy(BUCKETNAME, config);
}
} catch (Exception var7) {
throw new RuntimeException(var7);
}
}
文件下载
// fileName : /0/0/2025-9/合格率明细(2025-09).xlsx
public void downInfo(HttpServletResponse response, String ... fileName) {
if(fileName.length == 1){
// 单文件下载
downLoadOne(response,fileName[0]);
}else{
//多文件下载
downZip(response,fileName);
}
}
void downLoadOne(HttpServletResponse response, String filePath){
try {
InputStream fileStream = minioClient.getObject(BUCKETNAME, filePath);
String baseName = FilenameUtils.getBaseName(filePath);
response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(baseName, "UTF-8"));
//文件流输出
OutputStream out = new BufferedOutputStream(response.getOutputStream());
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = fileStream.read(buffer)) != -1) {
out.write(buffer, 0, bytesRead);
}
out.flush();
out.close();
fileStream.close();
} catch (Exception err) {
throw new RuntimeException("文件下载失败", err);
}
}
public void downZip(HttpServletResponse response,String ... fileName) {
FileServer fileServer = FileServerFactory.get(null);
// 设置响应头
response.setContentType("application/zip");
response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"download.zip\"");
// 创建流式响应
try (ZipOutputStream zipOutputStream = new ZipOutputStream(response.getOutputStream())) {
for (String filePath : fileName) {
// 获取文件流
InputStream fileStream = minioClient.getObject(BUCKETNAME, filePath);
// 创建ZIP条目
String baseName = FilenameUtils.getBaseName(filePath);
ZipEntry zipEntry = new ZipEntry(baseName);
zipOutputStream.putNextEntry(zipEntry);
// 写入数据
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = fileStream.read(buffer)) != -1) {
zipOutputStream.write(buffer, 0, bytesRead);
}
// 关闭条目和流
zipOutputStream.closeEntry();
fileStream.close();
}
zipOutputStream.finish();
} catch (Exception e) {
throw new RuntimeException("文件下载失败", e);
}
}
# 样例
# # 单文件
# # 多文件