/**
*
* @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("下载成功");
}
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(); }
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 = 0; i < worksList.size(); i++) { if (worksList.get(i).getWorksType() != null) { if (worksList.get(i).getWorksType() == 0) { if (StringUtils.isNotEmpty(worksList.get(i).getPicture()) && worksList.get(i).getPicture().indexOf("http://") != -1) { String[] urls = worksList.get(i).getPicture().split(","); for (int j = 0; 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[1024]; int r = 0; while ((r = fis.read(buffer)) != -1) { synchronized (zos) { zos.write(buffer, 0, r); } } fis.close(); } } } if (worksList.get(i).getWorksType() == 2) { // 图文作品 if (StringUtils.isNotEmpty(worksList.get(i).getContent()) && worksList.get(i).getContent().indexOf("http://") != -1) { Gson gson = new Gson(); List<WorkJsonEntity> urls = gson.fromJson(worksList.get(i).getContent(), new TypeToken<List<WorkJsonEntity>>() { }.getType()); for (int j = 0; 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[1024]; int r = 0; while ((r = fis.read(buffer)) != -1) { synchronized (zos) { zos.write(buffer, 0, r); } } fis.close(); } } } } } System.out.println("fis---close"); } } }