您的位置:首页 > 其它

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);
}
}

}


 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  二维码 web