WEB端 生成多张二维码图片并打包成ZIP包供下载
2013-10-29 11:32
561 查看
项目中需要一个功能,之前供增删改查的列表,现在需要做成:选择几项后,点击“生成二维码”,然后出现提示框,提示下载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); } } }
相关文章推荐
- Java 批量生成二维码图片,并打包成可直接下载的zip包(spring boot)
- java指定由若干url生成二维码png,然后打包为zip下载
- [Java Web]服务器获取远程文件并Zip打包给客户端下载
- java web 图片下载自动打包
- PHP生成一张含有二维码的图片(文章末尾附代码下载链接)
- QRCode生成二维码并批量ZIP下载
- webpack+vuecli打包生成资源相对引用路径与背景图片的正确引用
- 图片的上传 下载 js html file 打包下载 .zip
- Jenkins 2.46 打包apk后生成下载二维码
- 10月19_大数据导出多张excel表并打包成zip包下载
- 怎么制作生成苹果手机app应用的下载二维码图片
- Web项目将word打包zip并提供下载
- unity打包exe之后 下载或者生成的图片(不是直接赋给的资源)变模糊
- webpack+vuecli打包生成资源相对引用路径与背景图片的正确引用
- 微信公众平台开发 批量生成及下载带参二维码图片
- php 打包zip图片下载
- PHP生成一张含有二维码的图片(文章末尾附代码下载链接)
- PHP网页上打包文件生成压缩文件zip,并弹出下载
- 二维码生成. 文字生成图片. 多张图片合并方法及临时合成图片并下载
- 不保存批量生成二维码并压缩zip下载