小榄做网站企业,南京网站制作系统,网站不备案可以么,杭州seo管理分析
将生成的二维码图片#xff0c;以IO流的方式#xff0c;通过response响应体直接返回给请求方。
第一、不需要落到我们的磁盘#xff0c;操作在内存中完成#xff0c;效率比较高。
第二、所有生成二维码的请求#xff0c;都可以访问这里#xff0c;前端直接拿img标…分析
将生成的二维码图片以IO流的方式通过response响应体直接返回给请求方。
第一、不需要落到我们的磁盘操作在内存中完成效率比较高。
第二、所有生成二维码的请求都可以访问这里前端直接拿img标签的src就能访问你在浏览器直接输入这个路径也能得到一张图片减少了很多交互和逻辑处理。
第三、在前端实现因为前端可以将某个img标签的图片下载下来不需要消耗我们的服务器资源。
一、引入依赖
dependencygroupIdcom.google.zxing/groupIdartifactIdcore/artifactIdversion3.0.0/version/dependencydependencygroupIdcom.google.zxing/groupIdartifactIdjavase/artifactIdversion3.0.0/version/dependency
二、编写工具类
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;public class QRCodeUtils {/*** 生成二维码* param content 二维码的内容* return BitMatrix对象* */public static BitMatrix createCode(String content) throws IOException {//二维码的宽高int width 200;int height 200;//其他参数如字符集编码MapEncodeHintType, Object hints new HashMapEncodeHintType, Object();hints.put(EncodeHintType.CHARACTER_SET, UTF-8);//容错级别为Hhints.put(EncodeHintType.ERROR_CORRECTION , ErrorCorrectionLevel.H);//白边的宽度可取0~4hints.put(EncodeHintType.MARGIN , 0);BitMatrix bitMatrix null;try {//生成矩阵因为我的业务场景传来的是编码之后的URL所以先解码bitMatrix new MultiFormatWriter().encode(content,BarcodeFormat.QR_CODE, width, height, hints);//bitMatrix deleteWhite(bitMatrix);} catch (WriterException e) {e.printStackTrace();}return bitMatrix;}/*** 删除生成的二维码周围的白边根据审美决定是否删除* param matrix BitMatrix对象* return BitMatrix对象* */private static BitMatrix deleteWhite(BitMatrix matrix) {int[] rec matrix.getEnclosingRectangle();int resWidth rec[2] 1;int resHeight rec[3] 1;BitMatrix resMatrix new BitMatrix(resWidth, resHeight);resMatrix.clear();for (int i 0; i resWidth; i) {for (int j 0; j resHeight; j) {if (matrix.get(i rec[0], j rec[1]))resMatrix.set(i, j);}}return resMatrix;}
}三、编写API接口
/*** 生成二维码* param type 二维码的类型为了演示效果1跳百度的2是跳京东* */GetMapping(value /activity/create/activity-code)ApiOperation(生成活动详情二维码)public void getCode(int type , HttpServletResponse response) throws IOException {// 设置响应流信息response.setContentType(image/jpg);response.setHeader(Pragma, no-cache);response.setHeader(Cache-Control, no-cache);response.setDateHeader(Expires, 0);OutputStream stream response.getOutputStream();//type是1生成活动详情、报名的二维码type是2生成活动签到的二维码String content (type 1 ? http://www.baidu.com : http://www.jd.com);//获取一个二维码图片BitMatrix bitMatrix QRCodeUtils.createCode(content);//以流的形式输出到前端MatrixToImageWriter.writeToStream(bitMatrix , jpg , stream);}
四、访问测试
注意添加type 这样的话二维码图片根本就不用落到服务器的磁盘以流的方式就可以让前端直接访问。而且这个生成二维码的接口完全可以共用因为它不保存二维码只是返回图片的二进制流你传入对应的参数我就生成不同的二维码再返回对应的流。甚至二维码的目标链接你也可以让前端作为参数传给你但是前端要进行URL Encode减少了复杂性。
五、下载前端的代码
这一步完全就是前端的工作
function downloadImage(imgsrc, name) {//下载图片地址和图片名let image new Image();// 解决跨域 Canvas 污染问题image.setAttribute(crossOrigin, anonymous);image.onload function() {let canvas document.createElement(canvas);canvas.width image.width;canvas.height image.height;let context canvas.getContext(2d);context.drawImage(image, 0, 0, image.width, image.height);let url canvas.toDataURL(image/jpg); //得到图片的base64编码数据let a document.createElement(a); // 生成一个a元素let event new MouseEvent(click); // 创建一个单击事件a.download name || photo; // 设置图片名称a.href url; // 将生成的URL设置为a.href属性a.dispatchEvent(event); // 触发a的单击事件};image.src imgsrc;}
imgSrc就是图片的地址在这里指向我们上面的API就行因为我们的API响应的就是一张图片嘛。name就是下载之后的文件名。