二维码生成并上传至七牛云 返回图片URL

背景:最近一个项目的优惠券模块,需要将优惠券的券号转换成二维码展示出来,并保证能够被扫码枪识别。

接着,简要说明下编码思路,或者说步骤:

  • 引入 qrcode 的Jar依赖
  • 调用API,合理配置相关属性,生成二维码
  • 根据需要对第2步的图片进行一轮裁剪(可选)
  • 将图片以字节流的方式上传至七牛云
  • 拼接二维码的访问链接URL
     

手动导入依赖Jar:

  • Qrcode_A.jar
  • qrcode_B.jar

生成二维码

/**
 * @Description 二维码工具类
 * @Author blake
 * @Date 2018/12/8 下午4:57
 * @Version 1.0
 */
@Component
public class QrCodeUtils {

    private static final Logger logger = LoggerFactory.getLogger(QrCodeUtils.class);

    @Autowired
    private QiniuUploadUtils qiniuUploadUtils;

    /**
     * @return java.lang.String
     * @throws
     * @description 二维码生成
     * @params [qrData]
     */
    public String generateQrCodeThenUpload(String qrData) throws IOException {

        Qrcode x = new Qrcode();
        int version = 7;

        x.setQrcodeErrorCorrect('M');// 纠错等级
        x.setQrcodeEncodeMode('B');// N代表数字,A代表a-Z,B代表其它(中文等)
        x.setQrcodeVersion(version);// 版本号

        // int width=300;
        int width = 67 + 12 * (version - 1);

        // int height=300;
        int height = 67 + 12 * (version - 1);

        BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);

        Graphics2D gs = bufferedImage.createGraphics();
        gs.setBackground(Color.WHITE);
        gs.setColor(Color.BLACK);
        gs.clearRect(0, 0, width, height);

        int pixoff = 2;// 偏移量,如果不加有可能会导致识别不准确

        // 如果有汉字需要加上编码
        byte[] d = qrData.getBytes(StandardCharsets.UTF_8);

        if (d.length > 0 && d.length < 120) {

            boolean[][] s = x.calQrcode(d);

            for (int i = 0; i < s.length; i++) {
                for (int j = 0; j < s.length; j++) {
                    if (s[j][i]) {
                        gs.fillRect(j * 3 + pixoff, i * 3 + pixoff, 3, 3);
                    }
                }
            }
        }

        gs.dispose();
        bufferedImage.flush();
        ByteArrayOutputStream os = new ByteArrayOutputStream();

        // 生成二维码 => 图片写入字节输出流
        ImageIO.write(bufferedImage, "jpg", os);

        String domainAndKey = qiniuUploadUtils.uploadFilesViaServer(os);

        logger.info("QrCodeUtils.generateQrCodeThenUpload ========= 域名+Key:{} ========= ", domainAndKey);

        if (StringUtils.isNotBlank(domainAndKey)) {
            String[] dKeyArray = domainAndKey.split(",");
            return "http://" + dKeyArray[0] + "/" + dKeyArray[1];
        } else {
            logger.info("QrCodeUtils.generateQrCodeThenUpload ======== 二维码生成错误,请稍后重试!========");
            throw new CommonBusinessException("二维码生成错误,请稍后重试!");
        }

    }

}

七牛云上传

/**
 * @Description 七牛文件上传工具类
 * @Author blake
 * @Date 2018-12-19 17:40
 * @Version 1.0
 */
@Component
public class QiniuUploadUtils {

    @Value("${qiniu.cloud.access.Key}")
    private String accessKey;

    @Value("${qiniu.cloud.secret.Key}")
    private String secretKey;

    @Value("${qiniu.cloud.bucket}")
    private String bucket;

    @Value("${qiniu.cloud.domain}")
    private String domain;

    /**
     * @return void
     * @throws
     * @description 七牛云通过服务端上传文件(使用数据流传输)
     * @params [os]
     */
    public String uploadFilesViaServer(ByteArrayOutputStream os) {

        String retKey = "";

        // 构造一个带指定Zone对象的配置类
        Configuration cfg = new Configuration(Zone.zone2());

        UploadManager uploadManager = new UploadManager(cfg);

        String uuid = UUID.randomUUID().toString();

        // 等同于文件名
        String key = uuid.replace("-", "") + ".jpg";

        Auth auth = Auth.create(accessKey, secretKey);
        String upToken = auth.uploadToken(bucket);

        // 接收字节输出流,然后转换为字节输入流
        InputStream byteInputStream = new ByteArrayInputStream(os.toByteArray());

        try {
            Response response = uploadManager.put(byteInputStream, key, upToken, null, null);
            //解析上传成功的结果
            DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
            System.out.println(putRet.key);
            System.out.println(putRet.hash);

            retKey = putRet.key;
        } catch (QiniuException ex) {
            Response r = ex.response;
            System.err.println(r.toString());
            try {
                System.err.println(r.bodyString());
            } catch (QiniuException ex2) {
                //ignore
            }
        }

        return domain + "," + retKey;
    }
}

猜你喜欢

转载自blog.csdn.net/wub116/article/details/86555193
今日推荐