• 从网络获取多张二维码图片,压缩打包下载


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

    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 }

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

  • 相关阅读:
    ubuntu安装docker-compose
    docker-compose常用命令(持续更新...)
    docker运行jpress
    gcc -o选项:指定输出文件
    gcc -c:只编译不链接,仅生成目标文件
    WMWare下安装centOS7,并使用xshell进行连接记录.
    主线程和子线程多种情况小探讨
    Sleep的本质
    为什么要对多线程进行加锁操作呢
    list操作相关总结
  • 原文地址:https://www.cnblogs.com/2YSP/p/8043009.html
Copyright © 2020-2023  润新知