// 根据路径打包下载图片
publicvoidresponseImage(RoomCode[] roomCode, HttpServletResponse response) {
ZipOutputStreamzos= null;
InputStreamfis= null;
try {
// 文件的名称
StringdownloadFilename= System.currentTimeMillis() + ".zip";
// 转换中文否则可能会产生乱码
downloadFilename = URLEncoder.encode(downloadFilename, "UTF-8");
response.reset();
// 指明response的返回对象是文件流
response.setContentType("application/octet-stream");
// 设置在下载框默认显示的文件名
response.setHeader("Content-Disposition","attachment;filename=" + downloadFilename);
zos = new ZipOutputStream(response.getOutputStream());
for (inti = 0; i < roomCode.length; i++) {
if(org.apache.commons.lang3.StringUtils.isNoneBlank(roomCode[i].getUrl())) {
URLurl= newURL(imgUrl+ roomCode[i].getUrl());
zos.putNextEntry(new ZipEntry(roomCode[i].getRoomNum() + ".jpg"));
fis = url.openConnection().getInputStream();
byte[] buffer = newbyte[1024];
intr = 0;
while ((r = fis.read(buffer)) != -1) {
zos.write(buffer, 0, r);
}
fis.close();
}
}
zos.flush();
zos.close();
}catch(UnsupportedEncodingException e) {
logger.error("二维码下载失败!!");
e.printStackTrace();
}catch(IOException e) {
logger.error("二维码下载失败!!");
e.printStackTrace();
}finally{
if (fis != null) {
try {
fis.close();
}catch(Exception e2) {
e2.printStackTrace();
}
}
if (zos != null) {
try {
zos.close();
}catch(Exception e2) {
e2.printStackTrace();
}
}
}
}
// 直接生成图片 然后打包下载
publicstaticvoidgetBarCodeImgByUrl(String url, intwidth,intheight,String format, OutputStream os)
throws WriterException,IOException {
Map<EncodeHintType,Object> hints= newHashMap<EncodeHintType, Object>();
hints.put(EncodeHintType.CHARACTER_SET,"UTF-8");
BitMatrixbitMatrix;
bitMatrix = newMultiFormatWriter().encode(url, BarcodeFormat.QR_CODE, width,height,hints);
MatrixToImageWriter.writeToStream(bitMatrix, format, os);
}
publicstaticvoidwriteToStream(BitMatrix matrix, String format,OutputStream stream)throwsIOException {
BufferedImageimage= toBufferedImage(matrix);
if (!ImageIO.write(image, format, stream)) {
thrownew IOException("Could not write an image of format " + format);
}
}
publicvoiddownload(HttpServletRequest request, HttpServletResponse response, String identy){
// 通过活动标识和商户id查询活动
ZipOutputStreamzos= null;
try {
StringdownloadFilename= URLEncoder.encode("房间二维码下载", "UTF-8");// 转换中文否则可能会产生乱码
response.setContentType("application/octet-stream");// 指明response的返回对象是文件流
response.setHeader("Content-Disposition","attachment;filename=" + downloadFilename+ ".zip");// 设置在下载框默认显示的文件名
zos = new ZipOutputStream(response.getOutputStream());
for (inti = 0; i < 20; i++) {
zos.putNextEntry(new ZipEntry(System.currentTimeMillis()+ ".jpg"));// 命名
CodeUtil.getBarCodeImgByUrl("http://1243.com"+ i, 300, 300, "jpg", zos);// 拼接了url
}
zos.flush();
zos.close();
}catch(UnsupportedEncodingException e) {
e.printStackTrace();
}catch(IOException e) {
e.printStackTrace();
}catch(WriterException e){
e.printStackTrace();
}finally{
if (zos != null) {
try {
zos.flush();
zos.close();
}catch(IOException e) {
e.printStackTrace();
}
}
}
}
图片验证码的生成和显示
前端
<div class="col-sm-8" >
<img src="" id="codeImage">
</div>
<script th:inline="javascript">
varid = [[${roomInfoId}]];
$(function(){
$("#codeImage").attr("src","/system/room/show/"+id);
})
</script>
后端
@GetMapping("/show/{id}")
publicvoid show(@PathVariable("id") String id, HttpServletResponse response, HttpServletRequest request) {
response.setContentType("image/jpeg");// 设置相应类型,告诉浏览器输出的内容为图片
response.setHeader("Pragma","No-cache");// 设置响应头信息,告诉浏览器不要缓存此内容
response.setHeader("Cache-Control","no-cache");
response.setHeader("Set-Cookie","name=value; HttpOnly");// 设置HttpOnly属性,防止Xss攻击
response.setDateHeader("Expire",0);
roomInfoService.showCode(request, response, id);
}
@Override
publicvoid showCode(HttpServletRequest request, HttpServletResponse response, String id) {
// 根据id 生成二维码路径
try {
BufferedImageimage= CodeUtil.qRCodeImage(getUrlById(id), WIDTH, HIGH, Constant.PIC_SUFFIX);
ByteArrayOutputStreamtmp= newByteArrayOutputStream();
ImageIO.write(image, Constant.PIC_SUFFIX, tmp);
tmp.close();
IntegercontentLength= tmp.size();
response.setHeader("content-length",contentLength+ "");
response.getOutputStream().write(tmp.toByteArray());
}catch(Exception e) {
e.printStackTrace();
}
}