/**
*
* @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. 批量执行(Linux命令,上传/下载文件)

    前言: 每个公司的网络环境大都划分 办公网络.线上网络,之所以划分的主要原因是为了保证线上操作安全: 对于外部用户而言也只能访问线上网络的特定开放端口,那么是什么控制了用户访问线上网络的呢? 防火墙过 ...

  2. 九十四:CMS系统之cms后台登录限制

    装饰器,验证当前session中是否存在定义的user_id,没有就重定向到登录页 from flask import session, redirect, url_forfrom functools ...

  3. python3.7与pyspider的坑

    网络上安装pyspider的坑有很多,但都不如我今天的大,困扰了我几天,终于解决了 Traceback (most recent call last): File "/ffk_learn/s ...

  4. IDEA的热部署设置方式

    在这里只说一种简单的方式就是在idea中进行简单的设置就可以: 第一步:设置IDEA开启项目自动编译,进入设置找到Build,Execut, Deployment -> Compiler 勾选中 ...

  5. Java泛型(1):概述

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

  6. 7. grep

    grep命令 grep grep是通用正则表达式分析程序(General Regular Expression Parser)的缩写. grep命令可以在它的输入中搜索指定的字符串模式(Pattern ...

  7. HashPump用法

    做哈希长度扩展攻击的时候用到这个工具,但是没找到这个工具详解办法 我这篇不算是详解,只是收集例子做出的一个用法 HashPump一种在各种散列算法中利用散列长度扩展攻击的工具.目前支持的算法:MD5, ...

  8. 在openstack中安装mysql5.7

    在控制节点上执行 1.下载mysql二进制安装包和依赖包 wget http://mirror.centos.org/centos/7/os/x86_64/Packages/libaio-devel- ...

  9. 【原创】asp.net webdiyer AspNetPager控件分页码改变时,序号列从新从1开始问题的解决

      长话短说,首先看repeater 配合 webdiyer AspNetPager使用时webdiyer AspNetPager属性设置代码. <webdiyer:AspNetPager ID ...

  10. boostrap table接收到后台返回的数据格式不一致的解决方法

    后台使用的分页插件是mybatis的PageHelper,返回数据格式如下: 而bootstrap table插件需要服务端返回的数据格式中含有"total"和"rows ...