/**
*
* @param page
* @param rows
* @param works
* @return
* @author ffwwzz 下载zip
* @throws IOException
* @throws InterruptedException
*/
@RequestMapping("/download")
@ResponseBody
public CommonResult download(HttpServletRequest req, HttpServletResponse res)
throws IOException, InterruptedException {
List<Works> urls = service.selectPictures();
// List<String> urls = service.selectPictures1();
return new CommonResult().success("下载成功"); }
package com.sm.ayz.springcloud.aop;

import java.io.IOException;
import java.util.List; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes; import com.sm.ayz.springcloud.bean.works.Works;
import com.sm.ayz.springcloud.utils.FileUtil; /**
* 业务切面
*/
@Aspect
@Component
public class DownloadAop { @Pointcut("@annotation(com.sm.ayz.springcloud.annotation.Download)")
public void logCut() {
} @AfterReturning(returning = "rvt", pointcut = "logCut()")
public void after(JoinPoint jp, Object rvt) throws IOException, InterruptedException {
@SuppressWarnings("unchecked")
List<Works> list = (List<Works>) rvt; HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
.getRequest();
HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
.getResponse();
FileUtil.download(request, response, list); System.out.println("方法最后执行.....");
} }
@Override
@Download
public List<Works> selectPictures() {
return baseMapper.selectPictures();
}
package com.sm.ayz.springcloud.utils;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.sm.ayz.springcloud.bean.WorkJsonEntity;
import com.sm.ayz.springcloud.bean.works.Works; public class FileUtil { /**
* 下载并压缩
*
* @param request
* @param response
* @param urls
* @author ffwwzz
* @throws IOException
* @throws InterruptedException
*/
public static boolean download(HttpServletRequest request, HttpServletResponse response, List<Works> worksList)
throws IOException, InterruptedException {
String downloadFilename = "用户作品收录记录" + DateFormatTreadLocal.df.get().format(new Date()) + ".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());
dozip.download(worksList, zos);
DateFormatTreadLocal.df.remove();
zos.flush();
zos.close();
return true;
} /**
*
* @author fwz 静态工厂类,避免多线程工作数据读取失败
*
*/
static class DateFormatTreadLocal { private static ThreadLocal<SimpleDateFormat> df = new ThreadLocal<SimpleDateFormat>() {
@Override
protected SimpleDateFormat initialValue() {
return new SimpleDateFormat("yyyy-MM-dd");
}
};
} static class dozip { public dozip() {
} public static void download(List<Works> worksList, ZipOutputStream zos) throws IOException {
SimpleDateFormat sdf = DateFormatTreadLocal.df.get();
for (int i = ; i < worksList.size(); i++) {
if (worksList.get(i).getWorksType() != null) { if (worksList.get(i).getWorksType() == ) { if (StringUtils.isNotEmpty(worksList.get(i).getPicture())
&& worksList.get(i).getPicture().indexOf("http://") != -) {
String[] urls = worksList.get(i).getPicture().split(",");
for (int j = ; j < urls.length; j++) { URL url = new URL(urls[j]);
zos.putNextEntry(new ZipEntry(worksList.get(i).getTitle() + "-" + j
+ sdf.format(worksList.get(i).getIncludedTime()) + String.format("%02d", i)
+ ".jpg"));
// FileInputStream fis = new FileInputStream(new File(files[i]));
InputStream fis = url.openConnection().getInputStream();
byte[] buffer = new byte[];
int r = ;
while ((r = fis.read(buffer)) != -) {
synchronized (zos) {
zos.write(buffer, , r);
}
}
fis.close(); }
}
} if (worksList.get(i).getWorksType() == ) { // 图文作品 if (StringUtils.isNotEmpty(worksList.get(i).getContent())
&& worksList.get(i).getContent().indexOf("http://") != -) {
Gson gson = new Gson();
List<WorkJsonEntity> urls = gson.fromJson(worksList.get(i).getContent(),
new TypeToken<List<WorkJsonEntity>>() {
}.getType()); for (int j = ; j < urls.size(); j++) { URL url = new URL(urls.get(j).getImage());
zos.putNextEntry(new ZipEntry(worksList.get(i).getTitle() + "-" + j
+ sdf.format(worksList.get(i).getIncludedTime()) + String.format("%02d", i)
+ ".jpg"));
// FileInputStream fis = new FileInputStream(new File(files[i]));
InputStream fis = url.openConnection().getInputStream();
byte[] buffer = new byte[];
int r = ;
while ((r = fis.read(buffer)) != -) {
synchronized (zos) {
zos.write(buffer, , r);
}
}
fis.close(); }
}
}
}
}
System.out.println("fis---close");
} } }

java压缩下载图片并以zip流的形式下载到客户端的更多相关文章

  1. Java压缩技术(二) ZIP压缩——Java原生实现

    原文:http://snowolf.iteye.com/blog/642298 去年整理了一篇ZLib算法Java实现(Java压缩技术(一) ZLib),一直惦记却没时间补充.今天得空,整理一下ZI ...

  2. NPOI生成不规则Excel表格(并以流的形式下载,不将文件保存在服务器上,直接在客户端导出excel)

    //下载NPOI类库并添加引用 using NPOI.SS.UserModel; using NPOI.HSSF.UserModel; using NPOI.SS.Util; public stati ...

  3. Java部分总结图片版(已经加上原图链接下载!!!)

    Java基础知识图片版(原图下载链接)

  4. Java压缩技术(三) ZIP解压缩——Java原生实现

    原文:http://snowolf.iteye.com/blog/642492 JavaEye的朋友跟我说:“你一口气把ZIP压缩和解压缩都写到一个帖子里,我看起来很累,不如分开好阅读”.ok,面向读 ...

  5. Java生成二进制文件与Postman以二进制流的形式发送请求

    业务描述: 模拟终端(智能家居)发送HTTP POST请求,请求参数为二进制流:而且,二进制流是加密后的数据,因此调试分两步: 1.Java代码生成加密后数据,并保存为二进制流文件 (电脑上的图片就是 ...

  6. 解决vue、js 下载图片浏览器默认预览而不是下载

    在网页上,如果我们下载的地址对应的是一个jpg文件,txt文件等,点击链接时,浏览器默认的是打开这些文件而不是下载,那么如何才能实现默认下载呢? 后端解决 这就是Content-Disposition ...

  7. Java下载文件(流的形式)

    @RequestMapping("download") @ResponseBody public void download(HttpServletResponse respons ...

  8. java如何实现以数据流的形式下载压缩包到本地?

    先不多说,直接贴代码吧,在服务器的E盘下放一个E:/manual.rar的压缩包 package com.cellstrain.icell.controller; import org.springf ...

  9. 把文件打成zip或然rar下载 (详询请加qq:2085920154)

    //文件打包下载 public static HttpServletResponse downLoadFiles(List<File> files, HttpServletRequest ...

随机推荐

  1. python -v 和-V

    python -v 小写v:这是版本信息,包括库版本 python -V 大写v:只看python的版本

  2. 小D课堂 - 新版本微服务springcloud+Docker教程_6-06 zuul微服务网关集群搭建

    笔记 6.Zuul微服务网关集群搭建     简介:微服务网关Zull集群搭建 1.nginx+lvs+keepalive      https://www.cnblogs.com/liuyisai/ ...

  3. [GPU] Install H2O.ai

    一.前言 主页:https://www.h2o.ai/products/h2o4gpu/ GPU版本安装:h2oai/h2o4gpu 采用GPU,能否成为超越下面链接中实验的存在? [ML] LIBS ...

  4. vi/vim命令使用

    首先讲一些vim和vi的区别: 它们都是多模式编辑器,不同的是vim是vi的升级版本,它不仅兼容vi的所有指令,而且还有一些新的特性在里面.vim的这些优势主要体现在以下几个方面:1.多级撤消我们知道 ...

  5. java发送邮件(一)--补充添加附件

    今天来记录一下如何使用java来发送邮件 背景 之前项目有个需求,当产品出现故障时会把情况上送给服务器,服务器发送邮件将故障产品的位置以及故障信息等告知维修人员.发送邮件的接口不是我负责的,但是有兴趣 ...

  6. 【并行计算-CUDA开发】CUDA软件架构与Nvidia硬件对应关系

    前面扯了很多,不过大多都是在讲CUDA 在软体层面的东西:接下来,虽然Heresy 自己也不熟,不过还是来研究一下硬体的部分吧-毕竟要最佳化的时候,好像还是要大概知道一下相关的东西的.这部分主要参考资 ...

  7. 安装部署FastDFS

    安装部署FastDFS 此篇博文是在安装好虚拟机和CentOS7的前提和转自以下几篇博客得来: 1.开启CentOS的网络连接:   1.1.网址:http://blog.csdn.net/white ...

  8. Infix to Prefix conversion using two stacks

    Infix : An expression is called the Infix expression if the operator appears in between the operands ...

  9. 查找担保圈-step6-对被包含过的组进行清理,只保留未被包含过的组

    USE [test] GO /****** Object: StoredProcedure [dbo].[p04_get_groupno_cleared] Script Date: 2019/7/8 ...

  10. python 下安装pymysql数据库

    两种方法来安装pymysql 方法一.利用命令来安装 安装:python37 -m pip install pymysql 升级:python37 -m pip install pymysql --u ...