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);
            }
    }

# 样例

# # 单文件

# # 多文件


相关推荐
葫芦和十三4 小时前
图解 MongoDB 23|两地三中心:跨可用区部署怎么扛机房故障
后端·mongodb·agent
勇哥java实战分享5 小时前
PaddleOCR 太慢?我换成 RapidOCR 后,速度直接起飞
后端
苏三说技术10 小时前
LangChain4j 和 LangGraph4j,哪个更好?
后端
ServBay11 小时前
7 个AI开发中真正用得上的 MCP Server,配合Claude Code食用效果更佳
后端·claude·mcp
妙码生花11 小时前
从 PHP 到 AI + Golang,程序员自救转型手记(十五):优化细节、网络请求封装
前端·后端·ai编程
用户67570498850212 小时前
Go 语言里判断字符串为空,90% 的人都写错了!
后端·go
Flittly12 小时前
【AgentScope Java新手村系列】(16)从RAG到多路检索
java·spring boot·spring
用户67570498850212 小时前
Go 进阶必修:90% 的人都没用对的“表驱动法”
后端·go
小兔崽子去哪了12 小时前
Java 生成二维码解决方案
java·后端