SpringBoot文件下载(多文件以zip形式,单文件格式不变)

SpringBoot文件下载(多文件以zip形式,单文件格式不变)

初始化文件服务器(我的是minio)

java 复制代码
    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);
        }
    }

文件下载

java 复制代码
	// 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);
            }
    }

# 样例

# # 单文件

# # 多文件


相关推荐
一只旭宝43 分钟前
C++ 后端开发面试题整理
java·c++·面试
sunshine22 girl1 小时前
Java学习五 面向对象高级5 内部类3-静态内部类和局部内部类(了解)
java·学习
en.en..1 小时前
Linux 进程退出exit(函数)
java·开发语言·算法
李游Leo1 小时前
HarmonyOS 7 TaskPool + Node-API + zstd:Native 批量压缩任务的主线程隔离、进度回传与资源收口【鸿蒙心迹】
java·华为·harmonyos
Light Gao1 小时前
Encoder 与 Decoder 详解:从 Embedding 到 Seq2Seq 的完整数据流
java·开发语言·embedding
Harvil_1 小时前
任务跑一半,API 突然报“对话超长“断流:我给 Agent 修的紧急逃生通道
后端
用户EasyAdminBlazor1 小时前
EasyAdminBlazor SignalR 实时消息源码解析:从 NotificationHub 到站内消息
后端
程序猿乐锅1 小时前
【黑马点评 | 第十一篇】关注 Feed 流实现
java·数据库·redis·分布式·后端·缓存·maven
用户EasyAdminBlazor1 小时前
EasyAdminBlazor 定时任务:FreeScheduler 可视化调度与任务管理
后端
开开心心就好2 小时前
图片白底怎么去掉?抠图工具抠完背景透明
java·服务器·开发语言·pdf·ocr·散列表·启发式算法