/**
*
* @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. 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_6-1.常用的第三方支付和聚合支付介绍

    笔记 第六章 开发在线教育视频站点核心业务之从零基础接入 微信扫一扫网页支付 1.常用的第三方支付和聚合支付介绍     简介:介绍常用的第三方支付和聚合支付 1.什么是第三方支付         第 ...

  2. [ML] Machine Learning in the Common Infrastructure ecosystem

    一.CogNet架构 下图,可见Kafka的作用. Partial code: Machine Learning in the Common Infrastructure ecosystem Rele ...

  3. Scala面向对象03

  4. R语言与概率统计(一) 描述性统计分析

      #查看已安装的包,查看已载入的包,查看包的介绍 ########例题3.1 #向量的输入方法 w<-c(75.0, 64.0, 47.4, 66.9, 62.2, 62.2, 58.7, 6 ...

  5. Spring MVC的多视图解析器配置及与Freemarker的集成

    一.从freemarker谈起 Freemarker使用模板技术进行视图的渲染.自从看了Struts标签.Freemarker.JSTL的性能对比后,我毅然决定放弃Struts标签了!效率太差…… S ...

  6. 树莓派-Ubuntu Mate开启ssh服务

    1. 运行 apt search openssh-server 查看是否安装ssh服务. 2. 如已安装,运行 sudo dpkg-reconfigure openssh-server 重新配置shh ...

  7. 【Struts中private static final long serialVersionUID的作用】

     private static final long serialVersionUID = -1672970955045193907L;   SerialVersionUID,后面简称SUID 其实序 ...

  8. AES 加密算法的原理详解

    AES 加密算法的原理详解 本教程摘选自 https://blog.csdn.net/qq_28205153/article/details/55798628 的原理部分. AES简介 高级加密标准( ...

  9. Win10编译Mingw

    准备工具 Windows平台 cmake mingw-x64 Linux平台(Ubuntu) sudo apt-get install git cmake cmake-gui -y 下载源码 建议直接 ...

  10. Go语言入门篇-JSON&http调用

    一.Decoder /(一)Decoder func DecoderExample(){ const jsonStream = ` { "Name" : "Ed" ...