/**
*
* @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. Python3+RobotFramewok 循环判断以及Evaluate用法(三)

    本章主要介绍RF的循环,判断以及关键字Evaluate. 1. for循环 在RF中通过 :FOR 编写循环 :FOR ${i} in range 10 log ${i} @{list} create ...

  2. LAMP之Apache调优

    一.环境的搭建 实验环境: 操作系统:Centos 7.4 [root@xuegod70 ~]# ls apr-1.6.3.tar.gz apr-util-1.6.1.tar.bz2 httpd-2. ...

  3. phoenix创建表失败:phoenixIOException: Max attempts exceeded

    下面的问题,搞了1天才解决,太坑了,在这里记录一下. 问题现像:执行命令后,1分钟没有返回, 然后报下面的错,偶尔会出现以下不同的报错信息. jdbc:phoenix:10.0.xx.1:2181&g ...

  4. iOS开发嵌套ReactNative页面

    最近使用ReactNative做项目,有信心今天目标把ReactNative框架掌握,所以自己从每个知识点学习提高自己吧...... 步骤如下: 一.创建依赖包文件(package.json): Re ...

  5. Java泛型(1):概述

    通常而言,我们使用一种容器来存储一种类型的对象.而泛型的主要目的之一就是用来指定这个容器要持有什么类型的对象.因此,与其使用Object,我们可以暂时不指定类型. 看下面3个例子: (1) 我们有时候 ...

  6. koa2中间件

    在我看来,前端框架的中间件的思想来源于传统后端的切面编程(AOP)思想,比如我们常见的身份校验(JWT). axios的拦截器也是基于这种程序设计模式的. 在koa中,实际上是由一个数组对象来保存所有 ...

  7. git-忽略不想提交到git的文件

    在代码目录下建立.gitignore文件: .gitignore (用记事本另存可以保存这个名字),配置上要忽略的文件或者文件夹,然后提交到git 上就可以了.

  8. lua学习笔记1--基础语法

    print("打印日志");--单行注释 --[[ 多行注释 --]] a = --变量的类型,是由变量储存的数据决定 数据类型: number:数值类型,可以存储整数和小数 bo ...

  9. curl and wget

    写在前面: a.  对比curl 和 wget 的相同和不同点 来记忆 a-1 curl url  直接将请求内容输出到标准输出. 如果下载不是瞬时间完成,会显示下载进度条,如果向取消,加-s : w ...

  10. 安装networking-sfc

    申明: 主参考:https://docs.openstack.org/networking-sfc/queens/ 辅参考: https://blog.csdn.net/linshenyuan1213 ...