zoukankan      html  css  js  c++  java
  • 从网络获取多张二维码图片,压缩打包下载

    项目最近有这个小需求,记录一下。

    controller层:

     1 /**
     2      * 批量下载二维码图片
     3      *
     4      * @param deviceIdStr
     5      */
     6     @RequestMapping("qr_code")
     7     public void batchDownLoadQrCode(String deviceIdStr, HttpServletResponse response) throws Exception {
     8         String[] deviceId = deviceIdStr.split(",");
     9         List<Integer> deviceIds = new ArrayList<>();
    10         for (String id : deviceId) {
    11             deviceIds.add(Integer.valueOf(id));
    12         }
    13         DeviceQueryForm deviceQueryForm = new DeviceQueryForm();
    14         deviceQueryForm.setDeviceIds(deviceIds);
    15         List<Device> deviceList = deviceClient.getDeviceList(deviceQueryForm);
    16 
    17 //      生成zip文件
    18         String name = "qrCode" + System.currentTimeMillis();
    19         String zipFileName = name + ".zip";
    20         String projectPath = System.getProperty("user.dir");
    21         String path = projectPath + File.separator + "qrCode";
    22         
    23         File file = new File(path);
    24         //文件夹不存在则创建
    25         if (!file.exists()) {
    26             file.mkdirs();
    27         }
    28         //新建一个zip
    29         File zipFile = new File(path + File.separator + zipFileName);
    30         ZipOutputStream zipOutputStream = new ZipOutputStream(new FileOutputStream(zipFile));
    31 
    32         for (Device device : deviceList) {
    33             String imageName = device.getDeviceCode() + ".jpg";
    34 
    35             if (StringUtils.isBlank(device.getQrCodeUrl())) {
    36                 continue;
    37             }
    38 
    39             URL url = new URL(device.getQrCodeUrl());
    40             URLConnection conn = url.openConnection();
    41             conn.setConnectTimeout(3000);
    42             InputStream inputStream = conn.getInputStream();
    43             File imageFile = FileUtil.generateImageFile(inputStream, path, imageName);
    44 
    45             FileUtil.generateZip(zipOutputStream, imageFile);
    46 
    47             //删除图片
    48             if (imageFile.exists()) {
    49                 imageFile.delete();
    50             }
    51         }
    52 
    53         zipOutputStream.flush();
    54         zipOutputStream.close();
    55 
    56         //输出到客户端
    57         OutputStream out = response.getOutputStream();
    58         response.reset();
    59         response.setHeader("Content-Disposition", "attachment;filename=" + zipFileName);
    60         response.setContentType("application/zip;charset=utf-8");
    61         response.setCharacterEncoding("UTF-8");
    62         out.write(FileUtils.readFileToByteArray(zipFile));
    63         out.flush();
    64         out.close();
    65         //删除压缩包
    66         if (zipFile.exists()) {
    67             zipFile.delete();
    68         }
    69     }

    工具类:

     1 package cn.ubox.mbss.ops.backend.utils;
     2 
     3 import java.io.*;
     4 import java.util.zip.ZipEntry;
     5 import java.util.zip.ZipOutputStream;
     6 
     7 /**
     8  * @Author: 2YSP
     9  * @Description:
    10  * @Date: Created in 2017/12/13
    11  */
    12 public class FileUtil {
    13     /**
    14      * 生成二维码图片
    15      * @param inputStream
    16      * @param path
    17      * @param imageName
    18      */
    19     public static File generateImageFile(InputStream inputStream,String path,String imageName){
    20         FileOutputStream outStream = null;
    21         File imageFile = null;
    22         BufferedInputStream bufferStream = null;
    23         try{
    24             //创建二维码图片
    25             imageFile = new File(path + File.separator + imageName);
    26 
    27             outStream = new FileOutputStream(imageFile);
    28             bufferStream = new BufferedInputStream(inputStream);
    29             byte[] data = new byte[1024 * 100];
    30             int len = 0;
    31             while ((len = bufferStream.read(data)) != -1) {
    32                 //写入数据
    33                 outStream.write(data, 0, len);
    34             }
    35         }catch (IOException e){
    36             e.printStackTrace();
    37         }finally {
    38             if (outStream != null){
    39                 try {
    40                     outStream.flush();
    41                     outStream.close();
    42                 } catch (IOException e) {
    43                     e.printStackTrace();
    44                 }
    45             }
    46             if (bufferStream != null){
    47                 try {
    48                     bufferStream.close();
    49                 } catch (IOException e) {
    50                     e.printStackTrace();
    51                 }
    52             }
    53         }
    54         return imageFile;
    55     }
    56 
    57     /**
    58      * 压缩图片为zip格式
    59      * @param zipOutputStream
    60      * @param imageFile
    61      *
    62      */
    63     public static void generateZip(ZipOutputStream zipOutputStream,File imageFile){
    64         BufferedInputStream bufferStream = null;
    65         try {
    66             InputStream input = new FileInputStream(imageFile);
    67             String zipEntryName = imageFile.getName();
    68             byte[] bytes = new byte[1024 * 100];// 读写缓冲区
    69             bufferStream =  new BufferedInputStream(input);// 输入缓冲流
    70 
    71             ZipEntry zipEntry = new ZipEntry(zipEntryName);
    72             // 定位到该压缩条目位置,开始写入文件到压缩包中
    73             zipOutputStream.putNextEntry(zipEntry);
    74             int len = 0;
    75             while ((len = bufferStream.read(bytes)) != -1) {
    76                 zipOutputStream.write(bytes, 0, len);
    77             }
    78         }catch (IOException e){
    79             e.printStackTrace();
    80         }finally {
    81             if (bufferStream != null){
    82                 try {
    83                     bufferStream.close();
    84                 } catch (IOException e) {
    85                     e.printStackTrace();
    86                 }
    87             }
    88         }
    89     }
    90 }

    如果大家觉得有需要优化的地方,欢迎留言讨论。

  • 相关阅读:
    java.lang.IllegalArgumentException: When allowCredentials is true, allowedOrigins cannot contain the special value "*" since that cannot be set on the "Access-Control-Allow-Origin" response header.
    spring-session-data-redis依赖冲突问题
    centos7启动iptables时报Job for iptables.service failed because the control process exited with error cod
    图片上传后台服务报内存溢出 Out Of Memory Java heap space
    mysql 数据库密码忘记重置 进行远程连接
    打Jar包
    Type interface com.innovationV2.mapper.UserMapper is not known to the MapperRegistry
    关于java基础类型Integer String的clone()
    clion使用clang编译
    token & refresh token 机制总结
  • 原文地址:https://www.cnblogs.com/2YSP/p/8043009.html
Copyright © 2011-2022 走看看