某项目需要,要进行相关图片的打包下载功能,已解决,踩坑后打卡,整理如下:
后端
获取需要打包的图片文件路径(图片链接或图片保存的本地路径),之后设置压缩包名称,各图片名称,输入输出流操作,等进行实现,代码如下:
Controller层:
@RequestMapping("/downloadImgs")
public void downLoadImgs(Long id,HttpServletRequest request, HttpServletResponse response) {
String basepath=getBasePath();
// 本地资源路径
basepath = Global.getProfile();
orderInfoService.downloadImgs(id,basepath,request,response);
}
Service层:(totalpassenger为信息列表,每条数据包含已获取的文件路径)
if(totalpassenger!=null&&totalpassenger.size()>0){
/*批量下载*/
try {
String downloadFilename="";
String nowTimeString = String.valueOf(System.currentTimeMillis());
downloadFilename = order.getSysOrderNo()+"-"+order.getNickname()+".zip";//文件的名称
downloadFilename = URLEncoder.encode(downloadFilename, "UTF-8");//转换中文否则可能会产生乱码
response.setContentType("application/octet-stream");// 指明response的返回对象是文件流
response.setHeader("Content-Disposition", "attachment;filename=" + downloadFilename);// 设置在下载框默认显示的文件名
ZipOutputStream zos = new ZipOutputStream(response.getOutputStream());
FileInputStream ips = null;
File file =new File("");
String url="";
byte[] buffer = new byte[1024];
int r=0;
for (int i = 0; i < totalpassenger.size(); i++) {
if(totalpassenger.get(i).getPassport_pic()!=null){
/* URL url2 = new URL(totalpassenger.get(i).getPassport_pic());
zos.putNextEntry(new ZipEntry(totalpassenger.get(i).getName()+"-护照"+".jpg"));
InputStream fis2 = url2.openConnection().getInputStream();
while ((r = fis2.read(buffer)) != -1) {
zos.write(buffer, 0, r);
}
fis2.close();*/
zos.putNextEntry(new ZipEntry(totalpassenger.get(i).getName()+"-护照"+".jpg"));
url=totalpassenger.get(i).getPassport_pic();
//获取图片存放路径
file = new File(url);
if(file.exists()) {
ips = new FileInputStream(file);
response.setContentType("multipart/form-data");
while ((r = ips.read(buffer)) != -1){
zos.write(buffer, 0, r);
}
if (null != ips) {
ips.close();
}
}
}
}
zos.flush();
zos.close();
} catch (Exception e) {
e.printStackTrace();
}
}else{
return -1;
}