首页 > 其他分享 >SpringBoot 多文件打包下载

SpringBoot 多文件打包下载

时间:2024-06-12 16:32:23浏览次数:27  
标签:文件 SpringBoot len headers zos 打包 new HttpHeaders 下载

第一种

    @RestController
    @RequestMapping("/download")
    public class DownloadController {

        @GetMapping("/files")
        public ResponseEntity<InputStreamResource> downloadFiles() throws IOException {
            // 创建临时ZIP文件
            Path zipFilePath = Files.createTempFile("files", ".zip");
            // 需要打包的文件路径
            String[] filePaths = {
                    "D:/QQ截图20240520102047.jpg",
                    "D:/人员考勤记录.xlsx"
            };
            // 打包文件
            try (ZipOutputStream zos = new ZipOutputStream(Files.newOutputStream(zipFilePath))) {
                for (String filePath : filePaths) {
                    File file = new File(filePath);
                    try (FileInputStream fis = new FileInputStream(file)) {
                        ZipEntry zipEntry = new ZipEntry(file.getName());
                        zos.putNextEntry(zipEntry);

                        byte[] buffer = new byte[1024];
                        int len;
                        while ((len = fis.read(buffer)) > 0) {
                            zos.write(buffer, 0, len);
                        }
                        zos.closeEntry();
                    }
                }
            }
            // 返回ZIP文件
            InputStreamResource resource = new InputStreamResource(Files.newInputStream(zipFilePath));
            HttpHeaders headers = new HttpHeaders();
            headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename="+URLEncoder.encode("files.zip","UTF-8"));
            return ResponseEntity
                    .ok()
                    .headers(headers)
                    .contentType(MediaType.APPLICATION_OCTET_STREAM)
                    .body(resource);
        }
        
    }

第二种与MINIO文件服务器集成,inputStream这里需要改成自己的Api

    @GetMapping("/download/files")
    public ResponseEntity<InputStreamResource> downloadFiles(@RequestParam List<String> fileTokens) throws IOException {
        // 获取文件信息列表
//        List<FileEntity> fileEntities = fileRepository.findByFileTokenIn(fileTokens);
//        LambdaQueryWrapper<SysOss> sysOssLambdaQueryWrapper = Wrappers.lambdaQuery(SysOss.class).in(SysOss::getFileToken, fileTokens);

        GetFileInfoParam getFileInfoParam = new GetFileInfoParam();
        getFileInfoParam.setF8s(fileTokens);
        List<SysOssVO> ossVOList =
                iFileDownloadClient.getFileByToken(getFileInfoParam).getData();
        if (ossVOList.isEmpty()) {
            return null;
        }
        // 创建字节数组输出流用于打包ZIP文件
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        try (ZipOutputStream zos = new ZipOutputStream(byteArrayOutputStream)) {
            for (SysOssVO ossVO : ossVOList) {
//                String bucketName = fileEntity.getBucketName();
//                String objectName = fileEntity.getObjectName();
//                String fileName = fileEntity.getFileName();

                // 从MinIO获取文件输入流
                /*try (var inputStream = minioClient.getObject(
                        GetObjectArgs.builder()
                                .bucket(bucketName)
                                .object(objectName)
                                .build())) {*/


                    try (var inputStream = iFileDownloadClient.getAttachmentStream(ossVO.getFileToken())) {


                    // 将文件写入ZIP文件
                    ZipEntry zipEntry = new ZipEntry(ossVO.getFileName());
                    zos.putNextEntry(zipEntry);

                    byte[] buffer = new byte[1024];
                    int len;
                    while ((len = inputStream.read(buffer)) > 0) {
                        zos.write(buffer, 0, len);
                    }
                    zos.closeEntry();
                }
            }
        }

        // 返回ZIP文件
        InputStreamResource resource = new InputStreamResource(new ByteArrayInputStream(byteArrayOutputStream.toByteArray()));

        HttpHeaders headers = new HttpHeaders();
        headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename="+URLEncoder.encode("files.zip","UTF-8"));

        return ResponseEntity
                .ok()
                .headers(headers)
                .contentType(MediaType.APPLICATION_OCTET_STREAM)
                .body(resource);
    }

 

标签:文件,SpringBoot,len,headers,zos,打包,new,HttpHeaders,下载
From: https://www.cnblogs.com/Jack-zhao/p/18244225

相关文章

  • 我才不要和你做朋友呢百度云/迅雷BT下载[BD/HD-MKV1.77G/8.52G][高清版]
    电影《我才不要和你做朋友呢》是一部极具深度和情感的作品,通过展现人际关系的复杂性和友谊的真实性,为观众带来了深刻的思考。影片以两位主角小明和小红的故事展开。小明是一个内向而害羞的男孩,小红则是一个外向而热情的女孩。他们在同一个学校里上学,但却几乎没有交集......
  • Docker将运行中容器打包成镜像并保存到本地
    在Docker中,我们可以将正在运行的容器保存为镜像,这样就可以随时随地重新创建相同的容器环境。以下是具体步骤:将运行中的Docker容器保存为镜像首先,我们需要找到正在运行的容器的ID或名称。可以通过运行dockerps命令来查看当前运行的容器列表。然后,使用以下命令将容器保存为镜像......
  • nodejs下载依赖npm install报错
    npminstall报错,解决记录_npmwarnusing--forcerecommendedprotectionsdis-CSDN博客先切换镜像源,然后清理缓存,在使用npm命令注意前面可能爆粗哦的原因大概率是权限问题,所以采用这种解决方式加上面合体:解决:安装vueCLI不成功时,执行npmcleancache-force清除缓存命令无效_n......
  • 网易面试:SpringBoot如何开启虚拟线程?
    虚拟线程(VirtualThread)也称协程或纤程,是一种轻量级的线程实现,与传统的线程以及操作系统级别的线程(也称为平台线程)相比,它的创建开销更小、资源利用率更高,是Java并发编程领域的一项重要创新。PS:虚拟线程正式发布于Java长期支持版(LongTermSuort,LTS)Java21(也就是JDK21)。......
  • 前端JSZip结合file-saver下载文件打包导出压缩文件
    需求场景:前端拿到下载文件的url,请求并将文件进行分类压缩生成压缩包导出前端导出文件的优点:减轻服务器负担:后端生成压缩文件可能会占用服务器资源和时间。如果压缩的内容很大,可能会导致服务器压力增加,影响其他用户的访问速度。将这些任务转移到前端可以减轻服务器负担,提高......
  • SpringBoot面试准备 第一天
    什么是SpringBoot?简化Spring 应用程序开发的框架,通过自动配置、起步依赖和简化的配置方式,使开发人员能够更快速、方便地创建和配置Spring应用程序,提高开发效率和开发体验目标是使开发人员能够更加快速、方便地创建和配置Spring应用程序,同时尽可能地减少样板代码和繁琐......
  • Quasar+Electron开发打包为桌面端exe
    上一篇博客写了Quasar+Cordova开发打包移动端app,今天来写一下Quasar+Electron如何开发打包为桌面端exe。Electron英文文档:https://www.electronjs.org/docs/latest/  Electron中文文档:https://electron.nodejs.cn/Quasar+Electron文档:https://www.quasar-cn.cn/quasar-cli......
  • 【接口自动化测试框架练习】springboot+react+mysql~极简版postman
    可以说是一个toyprogram,chatgpt完成了一部分工作,我也完成了一部分工作,我俩合作的,我占百分之80%,他百分之20%,哈哈没他不行,源码奉上。https://github.com/Jinwenxin/test-api-frontend1.功能简介:分成三部分,如左侧导航栏所示:测试用例管理:测试用例的增删改查以及运行测试套件管理......
  • TIKTOK海外抖音实操班:下载注册/配置/养号/引流/发视频/等等(共17课)
    这个课程教你怎样在Tiktok上注册、设置、养号、吸引流量和发布视频。内容包括市场前景、与抖音的区别、下载和设置、网络环境、注册账号、打造优质号、找热门素材、使用热门标签和音乐、保持视频清晰度、上传技巧、避免账号被降权或封禁、优化流量下降、最佳发布时间和提高完播......
  • 【S087】Springboot+Thymleaf在线答疑系统项目源码 java源代码
    运行截图:登录学生注册教师注册学生发起问题联系我们后台首页常见问题管理添加常见问题人工答疑学生管理个人信息修改密码项目组成:项目源码:源码获取⬇⬇⬇......