SpringBoot文件下载(多文件以zip形式,单文件格式不变)
- 初始化文件服务器(我的是minio)
- 文件下载
- # 样例
- # # 单文件
- # # 多文件
初始化文件服务器(我的是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).xlsxpublic 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);}}
# 样例
# # 单文件
# # 多文件