JAVA生成跳转指定页面并且附带参数的二维码

简介: JAVA生成跳转指定页面并且附带参数的二维码

所需jar包:

 <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>core</artifactId>
            <version>3.1.0</version>
        </dependency>
        <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>javase</artifactId>
            <version>3.1.0</version>
        </dependency>
/**
 *
 * 实现说明:把服务器上的产品详情页的链接地址(含有ID)生成二维码,微信扫码,跳转到指定页
 * 需要jar:zxing-code-3.1.0.jar
 *
 */
public class GenerateCode {
 
    private static final int BLACK = 0xFF000000;
    private static final int WHITE = 0xFFFFFFFF;
 
    public static void main(String[] args) {
        try {
            boolean flag = generateCode("518");
            if (flag) {
                System.out.println("成功生成二维码");
            }
        } catch (WriterException | IOException e) {
            System.err.println("生成二维码失败");
            e.printStackTrace();
        }
    }
 
    public static boolean generateCode(String productId) throws WriterException, IOException {
        // 这里是URL,扫描之后就跳转到这个界面
        String text = "https://www.baidu.com/?uudi=" + productId;
 
        String path = "E:/"; // 图片生成的位置
        int width = 400;
        int height = 400;
        // 二维码图片格式
        String format = "jpg";
        // 设置编码,防止中文乱码
        Hashtable<EncodeHintType, Object> ht = new Hashtable<EncodeHintType, Object>();
        ht.put(EncodeHintType.CHARACTER_SET, "UTF-8");
        // 设置二维码参数(编码内容,编码类型,图片宽度,图片高度,格式)
        BitMatrix bitMatrix = new MultiFormatWriter().encode(text, BarcodeFormat.QR_CODE, width, height, ht);
        // 生成二维码(定义二维码输出服务器路径)
        File outputFile = new File(path);
        if (!outputFile.exists()) {
            // 创建文件夹
            outputFile.mkdir();
        }
 
        int b_width = bitMatrix.getWidth();
        int b_height = bitMatrix.getHeight();
        // 建立图像缓冲器
        BufferedImage image = new BufferedImage(b_width, b_height, BufferedImage.TYPE_3BYTE_BGR);
        for (int x = 0; x < b_width; x++) {
            for (int y = 0; y < b_height; y++) {
                image.setRGB(x, y, bitMatrix.get(x, y) ? BLACK : WHITE);
            }
        }
        // 生成二维码
        ImageIO.write(image, format, new File(path + "/code." + format));
        // 二维码的名称
        // code.jpg
 
        return true;
    }
}

通过接口下载:

@Controller
public class GenerateCode {
    private static final int BLACK = 0xFF000000;
    private static final int WHITE = 0xFFFFFFFF;
 
 
    @GetMapping("/download/{code}")
    public void downloadCode(@PathVariable String code, HttpServletResponse response) throws WriterException, IOException {
        // 这里是URL,扫描之后就跳转到这个界面
        String text = "https://www.baidu.com/?intited=" + code;
 
        int width = 400;
        int height = 400;
        // 二维码图片格式
        String format = "jpg";
 
 
        // 设置编码,防止中文乱码
        Hashtable<EncodeHintType, Object> ht = new Hashtable<EncodeHintType, Object>();
        ht.put(EncodeHintType.CHARACTER_SET, "UTF-8");
        // 设置二维码参数(编码内容,编码类型,图片宽度,图片高度,格式)
        BitMatrix bitMatrix = new MultiFormatWriter().encode(text, BarcodeFormat.QR_CODE, width, height, ht);
 
        int b_width = bitMatrix.getWidth();
        int b_height = bitMatrix.getHeight();
        // 建立图像缓冲器
        BufferedImage image = new BufferedImage(b_width, b_height, BufferedImage.TYPE_3BYTE_BGR);
        for (int x = 0; x < b_width; x++) {
            for (int y = 0; y < b_height; y++) {
                image.setRGB(x, y, bitMatrix.get(x, y) ? BLACK : WHITE);
            }
        }
        String fileName= new StringBuffer().append(code).append(".").append(format).toString();
        response.setHeader("Content-Type","application/octet-stream");
        response.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(fileName, "UTF-8"));
 
        response.setContentType("application/octet-stream; charset=utf-8");
        // 生成二维码
        ServletOutputStream fileOutputStream = response.getOutputStream();
        ImageIO.write(image, format, fileOutputStream);
        fileOutputStream.flush();
        fileOutputStream.close();
    }
 
 
}

或者这样也行

@Controller
public class GenerateCode {
    private static final int BLACK = 0xFF000000;
    private static final int WHITE = 0xFFFFFFFF;
 
    @GetMapping("/download/{code}")
    public void downloadCode(@PathVariable String code, HttpServletRequest request, HttpServletResponse response) throws WriterException, IOException {
        // 这里是URL,扫描之后就跳转到这个界面
        String text = "https://www.baidu.com/?intited=" + code;
 
        int width = 400;
        int height = 400;
        // 二维码图片格式
        String format = "jpg";
 
 
        // 设置编码,防止中文乱码
        Hashtable<EncodeHintType, Object> ht = new Hashtable<EncodeHintType, Object>();
        ht.put(EncodeHintType.CHARACTER_SET, "UTF-8");
        // 设置二维码参数(编码内容,编码类型,图片宽度,图片高度,格式)
        BitMatrix bitMatrix = new MultiFormatWriter().encode(text, BarcodeFormat.QR_CODE, width, height, ht);
 
        int b_width = bitMatrix.getWidth();
        int b_height = bitMatrix.getHeight();
        // 建立图像缓冲器
        BufferedImage image = new BufferedImage(b_width, b_height, BufferedImage.TYPE_3BYTE_BGR);
        for (int x = 0; x < b_width; x++) {
            for (int y = 0; y < b_height; y++) {
                image.setRGB(x, y, bitMatrix.get(x, y) ? BLACK : WHITE);
            }
        }
        String fileName= new StringBuffer().append(code).append(".").append(format).toString();
        // 设置下载文件的mineType,告诉浏览器下载文件类型
        String mineType = request.getServletContext().getMimeType(fileName);
        System.out.println(mineType);
        response.setContentType(mineType);
        response.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(fileName, "UTF-8"));
 
 
        // 生成二维码
        ServletOutputStream fileOutputStream = response.getOutputStream();
        ImageIO.write(image, format, fileOutputStream);
        fileOutputStream.flush();
        fileOutputStream.close();
    }
 
 
}

参考:https://my.oschina.net/ydsakyclguozi/blog/887368

目录
相关文章
|
17天前
|
Java
解析Java线程池:参数详解与执行流程
解析Java线程池:参数详解与执行流程
18 1
|
5天前
|
缓存 安全 算法
Java面试题:如何通过JVM参数调整GC行为以优化应用性能?如何使用synchronized和volatile关键字解决并发问题?如何使用ConcurrentHashMap实现线程安全的缓存?
Java面试题:如何通过JVM参数调整GC行为以优化应用性能?如何使用synchronized和volatile关键字解决并发问题?如何使用ConcurrentHashMap实现线程安全的缓存?
8 0
|
17天前
|
Java 编译器
Java健壮性 Java可移植性 JDK, JRE, JVM三者关系 Java的加载与执行原理 javac编译与JAVA_HOME环境变量介绍 Java中的注释与缩进 main方法的args参数
Java健壮性 Java可移植性 JDK, JRE, JVM三者关系 Java的加载与执行原理 javac编译与JAVA_HOME环境变量介绍 Java中的注释与缩进 main方法的args参数
19 1
|
5天前
|
设计模式 并行计算 安全
Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
10 0
|
14天前
|
缓存 监控 Java
Java中的虚拟机参数配置详解
Java中的虚拟机参数配置详解
|
17天前
|
Java API 数据处理
Java Bean参数验证:深入探索javax.validation.constraints注解
Java Bean参数验证:深入探索javax.validation.constraints注解
17 0
|
17天前
|
存储 Java
Java线程池参数详解及其示例
Java线程池参数详解及其示例
14 0
|
18天前
|
数据采集 Web App开发 前端开发
技术心得记录:如何用JAVA爬取AJAX加载后的页面(转载)
技术心得记录:如何用JAVA爬取AJAX加载后的页面(转载)
|
18天前
|
IDE Java Linux
在Maven中设置JVM系统参数及Java应用调试实例
在Maven中设置JVM系统参数及Java应用调试实例
23 0
|
19天前
|
Java Spring 容器
详解java参数校验之:顺序校验、自定义校验、分组校验(@Validated @GroupSequence)
详解java参数校验之:顺序校验、自定义校验、分组校验(@Validated @GroupSequence)