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

发布于:2025-09-06 ⋅ 阅读:(20) ⋅ 点赞:(0)

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


# 样例

# # 单文件

在这里插入图片描述

# # 多文件

在这里插入图片描述
在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到