java生成二维码

该博客详细介绍了如何在Java环境中使用QRCodeWriter和MatrixToImageWriter生成二维码,并将二维码保存到服务器。通过HTTP请求,结合数据库操作更新二维码状态,并提供二维码图片的下载。依赖了ZXing库的core和javase模块。
摘要由CSDN通过智能技术生成
//生成二维码
    @RequestMapping("/getQRCode")
    @ResponseBody
    public HashMap<String, Object> getQRCode(HttpServletRequest request, HttpServletResponse response,String id) throws Exception{
        int serverPort = request.getServerPort();
        String serverName = "http://"+ myHost + ":" + serverPort + contextPath;
        if(StringUtils.isBlank(id)) {
            return R.error("主键值不能为空,请修改。");
        }
        String tablename = "AM_Signin";
        HashMap<String, Object> obj = service.getMapByKey(tablename, id);
        String name = (String)obj.get("name");
        MySqlData mySqlData = new MySqlData();
        //数据库表名
        mySqlData.setTableName("AM_Signin");
        //保存默认值
//        mySqlData.setFieldValue("qrstatus", "1");//二维码状态,1:已生成
        mySqlData.setFieldWhere("id", id, "=");

        //二维码生成对象QRCodeWriter
        QRCodeWriter qrCodeWriter = new QRCodeWriter();
        String url = serverName + "/Achievements/AM_Signinuser/Add?activityid="+id;//扫二维码访问的地址
        int widthHeight = 500;
        BitMatrix bitMatrix = qrCodeWriter.encode(url, BarcodeFormat.QR_CODE,widthHeight,widthHeight);
        String realPath = request.getSession().getServletContext().getRealPath("/QRCode/");
//        realPath = realPath.replaceAll("\\\\","/");
        File file = new File(realPath);
        if (!file.exists()) {
            file.mkdirs();
        }
        String fileName = newDate.getDate("yyyyMMdd")+(new Random().nextInt(900000)+100000)+name+".png";
        mySqlData.setFieldValue("qrname", fileName);
        service.update(request, mySqlData);//修改二维码的生成状态
        String filePath = realPath + fileName;
        Path path = FileSystems.getDefault().getPath(filePath);
        MatrixToImageWriter.writeToPath(bitMatrix,"PNG",path);//将二维码图片写进文件夹
        //导出图片
        File readFile = new File(filePath);
        FileInputStream is = new FileInputStream(readFile);
        // 3. 获取响应输出流
        response.setContentType("text/plain;charset=UTF-8");
        // 4. 附件下载 attachment 附件 inline 在线打开(默认值)
        //处理下载后的文件,文件名不显示或乱码问题
        String filename = new String(fileName.getBytes(), "ISO-8859-1");
        response.setHeader("content-disposition", "attachment;fileName=" + filename);
        // 5. 处理下载流复制
        ServletOutputStream os = response.getOutputStream();
        int len;
        byte[] b = new byte[1024];
        while(true){
            len = is.read(b);
            if(len == -1) break;
            os.write(b, 0, len);
        }
        // 释放资源
        os.close();
        is.close();
        return R.ok();
    }
	<dependency>
		<groupId>com.google.zxing</groupId>
		<artifactId>core</artifactId>
		<version>3.3.0</version>
	</dependency>
	<dependency>
		<groupId>com.google.zxing</groupId>
		<artifactId>javase</artifactId>
		<version>3.3.0</version>
	</dependency>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值