java将oss链接打包成压缩包并返回

博主介绍: 22届计科专业毕业,来自湖南,主要是在CSDN记录一些自己在Java开发过程中遇到的一些问题,欢迎大家一起讨论学习,也欢迎大家的批评指正。

前言

需求:在用户列表中的一列中有个附件下载按钮,点击下载按钮需直接开始下载用户的附件压缩包。
在这里插入图片描述

用户的附件文件是以oss的url路径存储在数据库中的,多个文件以逗号分割例如:

https://xxxxx/user/head1.png,https://xxxxx/user/body1.png

解决

直接上代码

 public ResultData getFileZip(Integer id, HttpServletResponse response) throws IOException {

        ClassExpert classExpert = classExpertMapper.selectByPrimaryKey(id);
        String certificate = classExpert.getCertificate();
        // 1、查询所有照片文件url,封装成一个list
        String[] urls = certificate.split(",");
        // 2、设置压缩包名,与返回信息
        String zipFile = classExpert.getName() + ".zip";
        // 返给前端流
        // 设置响应的内容类型
        response.setContentType("application/zip");
        // 设置文件名,并进行URL编码
        String zipFileUtf8 = URLEncoder.encode(zipFile, "UTF-8");
        response.setHeader("Content-Disposition", "attachment; filename=\"" + zipFileUtf8 + "\"");
        ZipOutputStream zos = new ZipOutputStream(response.getOutputStream());

        // 压缩包
        try {
            for (String fileUrl : urls) {
                // 3.1 获取ossObject对象
                String fileName = fileUrl.substring(fileUrl.lastIndexOf("/") + 1);
                String objectName = fileUrl.replaceAll("https://" + MarvsmartConfig.new_sts_bucketName + "." + MarvsmartConfig.new_oss_endpoint + "/", "");
                OSSClientUtil ossClientUtil = new OSSClientUtil();
                OSSObject ossObject = ossClientUtil.getObject(objectName);

                // 3.2 直接从OSSObject的输入流读取数据并添加到ZIP文件
                zos.putNextEntry(new ZipEntry(fileName));
                try (InputStream inputStream = ossObject.getObjectContent()) {
                    byte[] buffer = new byte[1024];
                    int len;
                    while ((len = inputStream.read(buffer)) != -1) {
                        zos.write(buffer, 0, len);
                    }
                }
                zos.closeEntry();
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            zos.close();
        }
        return ResultData.success();
    }

注意

例如文件oss路径为

https://bucketname.beijin-endpoint/user/head123.png

即我们只需要根据实际情况调整代码中的objectName值为:

user/head123.png

代码中的fileName值为:

head123.png

OSSClientUtil是我自己封装的工具类大家根据自己的实际情况,获取到ossObject 对象即可

结果展示

请求接口会直接弹出下载
在这里插入图片描述

  • 8
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

机灵的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值