WEB端 生成多张二维码图片并打包成ZIP包供下载

   

    项目中需要一个功能,之前供增删改查的列表,现在需要做成:选择几项后,点击“生成二维码”,然后出现提示框,提示下载zip包,里面包含有所有二维码图片(刚生成的,不保存到缓存文件中)。

    分两个关键点:生成二维码但不保存到本地;打包流中的二维码并提供下载

    之前网上查的生成二维码,都局限于放到某个本地路径下;

    之前网上查的打包成zip,都局限于从本地路径下读取文件并打包,然后在放入某个路径下。

 

     之后,我订了一个工作测试计划,分三步走:

1、服务器端实现 生成二维码成流,然后供下载;

2、实现 将已有的多张D盘图片打包成ZIP后,供下载;

3、结合起来,将二维码图片放入ZIP包里,供下载,做到这步的话,就OK了。

 

 

生成二维码主流的方法只有两个,jar包分别为zxing,qrcode。前者是谷歌开发的,后者则是小日本开发的。
 
然后,按计划进行:
 
第一步,实现了,代码如下,只没有贴方法名:
 

//服务器端获取点击后的几项

   String tzDeviceIds = request.getParameter("tzDeviceIds");
   String[] idArr = tzDeviceIds.split(",");
   TzDeviceSVO svo = new TzDeviceSVO();
   svo.setTzDeviceId(idArr[0]);
   svo = TaiZhangDelegate.getDelegate().findByPK(svo);

//二维码内容放入
   String content = "ID:" + svo.getTzDeviceId() + ";tel:18899999999;mail:zhang@gmail.com";
   MultiFormatWriter multiFormatWriter = new MultiFormatWriter();
   Map hints = new HashMap();
   hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
   BitMatrix bitMatrix = multiFormatWriter.encode(content,BarcodeFormat.QR_CODE, 400, 400);
   

//重点,下面介绍
   response.reset();
   response.setContentType("application/octet-stream");
   response.setHeader("Content-Disposition", "attachment; filename="
     + URLEncoder.encode("ttt.jpg", "UTF-8"));
   OutputStream os = response.getOutputStream();

//将内容写入流
   MatrixToImageWriter.writeToStream(bitMatrix, "jpg", os);

   os.flush();
   os.close();

 
 
 
代码如上,注意,下载对话框的代码如下:

必须用上以下代码,才可以,专门用来下载的代码:


                        response.reset();

response.setContentType("application/octet-stream");

response.setHeader("Content-Disposition", "attachment; filename="

+ URLEncoder.encode("下载后显示的文件名,需加后缀", "UTF-8"));

OutputStream os = response.getOutputStream();

os.write(mvo.getBytes());//将数据写入流中

os.flush();

os.close();

 


 

 

 

 

2、看可不可以将已有的多张D盘图片打包成ZIP后,供下载;

答:所谓供下载,无非就是以上代码,七行,第三行中指定下载后的文件名,第五行将下载数据写入即可。

插个疑问: ZipOutputStream zos = new ZipOutputStream(os);这种是在干什么

 

试验成功,代码如下:
 String sourceFileName = "d:\\ttt1.jpg";
         String sourceFileName2 = "d:\\ttt2.jpg";
         
   response.reset();
   response.setContentType("application/octet-stream");
   response.setHeader("Content-Disposition", "attachment; filename="
     + URLEncoder.encode("a.zip", "UTF-8"));
   OutputStream os = response.getOutputStream();
   
   
      File sourceFile = new File(sourceFileName);
      File sourceFile2 = new File(sourceFileName2);
               byte[] buf = new byte[1024];

               //压缩文件名
               ZipOutputStream zos = new ZipOutputStream(os);
               ZipEntry ze = null;
               
               //创建一个ZipEntry,并设置Name和其它的一些属性
               ze = new ZipEntry(sourceFile.getName());
               ze.setSize(sourceFile.length());
               ze.setTime(sourceFile.lastModified());
               //将ZipEntry加到zos中,再写入实际的文件内容
               zos.putNextEntry(ze);
               InputStream is = new BufferedInputStream(new FileInputStream(sourceFile));
               int readLen = -1;
               while ((readLen = is.read(buf, 0, 1024)) != -1) {
                       zos.write(buf, 0, readLen);
               }
               is.close();
               
             //创建一个ZipEntry,并设置Name和其它的一些属性
               ZipEntry ze2 = new ZipEntry(sourceFile2.getName());
               ze2.setSize(sourceFile2.length());
               ze2.setTime(sourceFile2.lastModified());
               //将ZipEntry加到zos中,再写入实际的文件内容
               zos.putNextEntry(ze2);
               InputStream is2 = new BufferedInputStream(new FileInputStream(sourceFile2));
               int readLen2 = -1;
               while ((readLen2 = is2.read(buf, 0, 1024)) != -1) {
                       zos.write(buf, 0, readLen2);
               }
               is2.close();
               
               
               zos.close();
   
   
   os.flush();
   os.close();
  


 

 
 
 
3、

//第三次试验,成功,贴上完整代码,前两个代码没有写方法名,这个写上

 /**
  * WEB端生成二维码信息
  * 
  */
 public void generateQrCode(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response) {
  try {
   String tzDeviceIds = request.getParameter("tzDeviceIds");
   String[] idArr = tzDeviceIds.split(",");
   TzDeviceSVO svo = null;

   // 下载框代码
   response.reset();
   response.setContentType("application/octet-stream");
   response.setHeader("Content-Disposition", "attachment; filename="
     + URLEncoder.encode("台账二维码.zip", "UTF-8"));
   OutputStream os = response.getOutputStream();

   ZipOutputStream zos = new ZipOutputStream(os);
   //每一个ZipEntry对应一个文件
   ZipEntry ze = null;
   for (int i = 0; i < idArr.length; i++) {
    svo = new TzDeviceSVO();
    svo.setTzDeviceId(idArr[i]);
    svo = TaiZhangDelegate.getDelegate().findByPK(svo);
    //二维码内容放入这里
    String content = "ID:" + svo.getTzDeviceId()
      + ";\r\ntel:18899999999;\r\nmail:zhang@gmail.com";
    MultiFormatWriter multiFormatWriter = new MultiFormatWriter();
    Map hints = new HashMap();
    hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
    BitMatrix bitMatrix = multiFormatWriter.encode(content,
      BarcodeFormat.QR_CODE, 400, 400);

    // 创建一个ZipEntry,并可以设置Name和其它的一些属性
    ze = new ZipEntry(svo.getTzDeviceId() + ".jpg");//name
    //ze.setSize(sourceFile.length());
    //ze.setTime(sourceFile.lastModified());
    // 先将ZipEntry加到zos中,再写入实际的文件内容
    zos.putNextEntry(ze);
    MatrixToImageWriter.writeToStream(bitMatrix, "jpg", zos);//写入时写zos,而不是ze
   }

   zos.close();
   os.flush();
   os.close();
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

 

 

 

搞定,完全实现目的,对了,再粘贴个官方给的工具类:

import com.google.zxing.common.BitMatrix;

import javax.imageio.ImageIO;
import java.io.File;
import java.io.OutputStream;
import java.io.IOException;
import java.awt.image.BufferedImage;

/**
 * 生成二维码的工具类
 * @author zhangshaoqing
 * 
 */
public final class MatrixToImageWriter {

 private static final int BLACK = 0xFF000000;
 private static final int WHITE = 0xFFFFFFFF;

 private MatrixToImageWriter() {
 }

 public static BufferedImage toBufferedImage(BitMatrix matrix) {
  int width = matrix.getWidth();
  int height = matrix.getHeight();
  BufferedImage image = new BufferedImage(width, height,
    BufferedImage.TYPE_INT_RGB);
  for (int x = 0; x < width; x++) {
   for (int y = 0; y < height; y++) {
    image.setRGB(x, y, matrix.get(x, y) ? BLACK : WHITE);
   }
  }
  return image;
 }

 public static void writeToFile(BitMatrix matrix, String format, File file)
   throws IOException {
  BufferedImage image = toBufferedImage(matrix);
  if (!ImageIO.write(image, format, file)) {
   throw new IOException("Could not write an image of format "
     + format + " to " + file);
  }
 }

 public static void writeToStream(BitMatrix matrix, String format,
   OutputStream stream) throws IOException {
  BufferedImage image = toBufferedImage(matrix);
  if (!ImageIO.write(image, format, stream)) {
   throw new IOException("Could not write an image of format "
     + format);
  }
 }

}


 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值