博主介绍: 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,封装成一个listString[] 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 对象即可
结果展示
请求接口会直接弹出下载