1. 程式人生 > >不儲存批量生成二維碼並壓縮zip下載

不儲存批量生成二維碼並壓縮zip下載

對於我一個前端來說,做這個也是醉了;搜了好多都是對已有的檔案打包下載的,這裡自己組合了下;先看程式碼吧!

Controller方法(springMVC)

/**
	 * 二維碼
	 * 
	 * @param code
	 * @param request
	 * @param response
	 */
	@ResponseBody
	@RequestMapping(value = "createCode", method = RequestMethod.GET)
	public void createCode(Integer size) {
		QRCodeWriter writer = new QRCodeWriter();
		getResponse().setHeader("Pragma", "No-cache");
		getResponse().setHeader("Cache-Control", "no-cache");
		getResponse().setDateHeader("Expires", 0);
		getResponse().setContentType("application/zip");
		List<BufferedImage> buffImgs = new ArrayList<BufferedImage>();
		BitMatrix bitMatrix = null;
		try {
			for (int j = 1; j < 10; j++) {
				bitMatrix = writer.encode(
						Property.getProperty("system.qrcodeURL"),
						BarcodeFormat.QR_CODE, size, size);
				BufferedImage buffImg = MatrixToImageWriter
						.toBufferedImage(bitMatrix);
				Graphics g = buffImg.getGraphics();
				g.setColor(Color.red);
				// 最後一個引數用來設定字型的大小
				Font f = new Font("宋體", Font.BOLD, 20);
				g.setFont(f);
				// 10,20 表示這段文字在圖片上的位置(x,y) .第一個是你設定的內容。
				g.drawString("箱" + j, 10, 30);
				g.dispose();

				buffImgs.add(buffImg);
			}
			ZipOutputStream zos = new ZipOutputStream(getResponse()
					.getOutputStream());
			int i = 1;
			for (BufferedImage buf : buffImgs) {
				ZipEntry entry = new ZipEntry("箱" + i + ".jpeg");
				// 設定壓縮包的入口
				zos.putNextEntry(entry);
				JPEGImageEncoder en = JPEGCodec.createJPEGEncoder(zos);
				en.encode(buf);
				zos.flush();
				i++;
			}
			zos.close();
			// MatrixToImageWriter.writeToStream(bitMatrix, "jpeg",
			// getResponse()
			// .getOutputStream());
			getResponse().getOutputStream().flush();
			getResponse().getOutputStream().close();
		} catch (WriterException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

網頁前端JS

這裡需要做相容處理,IE核心支援iframe請求觸發下載;但是火狐和谷歌可以使用a標籤h5的download屬性
<pre name="code" class="javascript">                                       function DoSaveAsIMG() {  
                                          if (document.all.IframeReportImg.src != "about:blank")  
    	                                      window.frames['IframeReportImg'].document.execCommand("SaveAs");          
                                       } 
                                        var _size=$("#qrcode").val();
                                        var b_name = navigator.appName;
					if (b_name == "Microsoft Internet Explorer") {
					    //如果隱藏IFRAME不存在,則新增  
				        if (!document.getElementById("IframeReportImg"))  
				            $('<iframe style="display:none;" id="IframeReportImg" name="IframeReportImg" onload="DoSaveAsIMG();" width="0" height="0" src="about:blank"></iframe>').appendTo("body");  
				        if (document.all.IframeReportImg.src != opts.createQRCodeURL+"?size="+_size) {  
				            //載入圖片  
				            document.all.IframeReportImg.src = opts.createQRCodeURL+"?size="+_size;  
				        }  
				        else {  
				            //圖片直接另存為  
				            DoSaveAsIMG();    
				        }  
					}else{
						 var newA = document.createElement("a");
						 newA.download = "code";
						 newA.href = opts.createQRCodeURL+"?size="+_size;
						 document.body.appendChild(newA);
						 newA.click();
						 document.body.removeChild(newA);
					}