Java批量下载图片并生成zip并通过浏览器下载,本文的图片存放在对象存储上。
分为三步:
1、配置相关参数
// 1 将SecretId和SecretKey修改成自己对应的内容
COSCredentials cred = new BasicCOSCredentials("SecretId", "SecretKey");
// 2 设置Region
ClientConfig clientConfig = new ClientConfig(new Region("ap-beijing"));
// 3 生成cos客户端
COSClient cosClient = new COSClient(cred, clientConfig);
// 设置bucketName,该值可以在腾讯云控制台查看
String bucketName = "Bucket";
2、编写控制端代码
@RequestMapping("/downImageInfo")
public void downImageInfo(HttpServletRequest request,HttpServletResponse response){
//下载时显示的名字
String zipName = "imgtemp.zip";
ZipOutputStream zipOutputStream = null;
// 设置响应类型,以附件形式下载文件
response.reset();
response.setHeader("Location", zipName);
response.setHeader("Cache-Control", "max-age=0");
response.setHeader("content-type", "application/octet-stream");
response.setHeader("Content-disposition", "attachment;filename=" + zipName);
response.setCharacterEncoding("utf-8");
try {
zipOutputStream = new ZipOutputStream(response.getOutputStream());
//这是根据我自己的业务写的获取下载图片的列表
List<StudentVO> list = signInfoService.listStudentImageInfo();
// 循环根据路径从OSS获得对象,存入临时文件zip中
int i=0;
for (StudentVO vo : list) {
//key是cos中对应的文件名,如果你数据库中有单独存放就不需要下面的截断和拼接操作
String key = vo.getImagePath();
String suffix="";
if(key!=null){
key = key.substring(key.lastIndexOf("/")+1);
suffix = key.substring(key.indexOf("."));
}else{
key="";
}
//如果你的存储中有路径需要加上路径
key = "head/"+key;
// 根据path 和 bucket 从OSS获取对象
GetObjectRequest getObjectRequest = new GetObjectRequest(bucketName, key);
InputStream is = cosClient.getObject(getObjectRequest).getObjectContent();
// 将文件放入zip中,并命名不能重复,i主要是确保不会有重复的
zipOutputStream.putNextEntry(new ZipEntry(vo.getActualName()+"-"+i+suffix));
// 向压缩文件中写数据
byte[] buff = new byte[1024];
int len;
while ((len = is.read(buff)) != -1) {
zipOutputStream.write(buff, 0, len);
}
zipOutputStream.closeEntry();
is.close();
i++;
}
cosClient.shutdown();
} catch (Exception e) {
e.printStackTrace();
}finally {
if (zipOutputStream != null) {
try {
zipOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
3、在页面添加访问路径
直接在组件上面添加click事件,事件中加入下面的语句
window.location.href=访问路径+"/downImageInfo";
如果你的是OSS可以将里面的内容替换下面的部分
1、在上面的代码For语句前面加入下面的代码
OSSClient ossClient= OSSUtil.getInstance();
2、将下面的两句代码替换为指定的
GetObjectRequest getObjectRequest = new GetObjectRequest(bucketName, key);
InputStream is = cosClient.getObject(getObjectRequest).getObjectContent();
替换为
OSSObject ossObject = ossClient.getObject(OSSUtil.BUCKET, ossFile);
InputStream inputStream = ossObject.getObjectContent();