JAVA后台生成二维码并上传至OSS

JAVA后台生成二维码并上传至OSS

        生成二维码的依赖
        <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>
         阿里云的依赖
         <dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-sdk-oss</artifactId>
            <version>2.8.3</version>
        </dependency>
          日期转换依赖
             <dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
            <version>2.9.9</version>
            </dependency>

生成二维码

public class QRCodeGenerator {
    private final static String CHARSET ="utf-8";

    private final static int QRSIZEE =300;

    // 二维码颜色
    private static final int BLACK =0xFF000000;
    // 二维码颜色
    private static final int WHITE =0xFFFFFFFF;
    public static BufferedImage createImage(String id){
        String content = id;
        Hashtable<EncodeHintType, Object> hints =new Hashtable<EncodeHintType, Object>();
        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
        hints.put(EncodeHintType.CHARACTER_SET, CHARSET);
        hints.put(EncodeHintType.MARGIN,1);
        BitMatrix bitMatrix =null;
        try {
            bitMatrix =new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, QRSIZEE, QRSIZEE,hints);
        }catch (Exception e){
            e.printStackTrace();
        }
        int width = bitMatrix.getWidth();
        int height = bitMatrix.getHeight();
        BufferedImage image =new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

        for (int x =0; x < width; x++) {
            for (int y =0; y < height; y++) {
                image.setRGB(x, y, bitMatrix.get(x, y) ? BLACK : WHITE);
            }
        }
        return image;
    }

}
OSSClientUtil阿里云上传图片简单工具类  仅供测试使用,如需要详细工具类可自行网上搜索或者查看阿里云官方文档
public class OSSClientUtil {
    private static String endpoint = "";
    private static String accessKeyId = "";
    private static String accessKeySecret = "";
    private static String bucketName = "";
    private static String urlPrefix = "";

    @Autowired
    private static OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);

    /**
     * 上传图片
     *
     * @param url
     */
    public String uploadImg2Oss(MultipartFile url) throws Exception {
        // 文件新路径
        String fileName = url.getOriginalFilename();
        String filePath = getFilePath(fileName);

        // 上传到阿里云
        try {
            // 目录结构:images/2018/12/29/xxxx.jpg
            ossClient.putObject(bucketName, filePath, new
                    ByteArrayInputStream(url.getBytes()));
        } catch (Exception e) {
            e.printStackTrace();
        }
        //关流 ossClient.shutdown();
        return urlPrefix + filePath;
    }

    将文件目录分层方便查看管理
    private String getFilePath(String sourceFileName) {
        DateTime dateTime = new DateTime();
        return "images/" + dateTime.toString("yyyy")
                + "/" + dateTime.toString("MM") + "/"
                + dateTime.toString("dd") + "/" + System.currentTimeMillis() +
                RandomUtils.nextInt(100, 9999) + "." +
                StringUtils.substringAfterLast(sourceFileName, ".");
    }
}

Service类

@Service
public class InspectionPointService {
    public String updateHead(MultipartFile file)throws Exception {
        if (file ==null || file.getSize() <=0) {
            throw new Exception("file不能为空");
        }
        OSSClientUtil ossClient =new OSSClientUtil();
        String name = ossClient.uploadImg2Oss(file);
        return name;
    }

    public String PrintQRCode(String pointId)throws Exception {
        String[] pointIds=pointId.split(",");
        String urls="";
        for (String id:pointIds) {
            BufferedImage image = QRCodeGenerator.createImage(id);
            // 创建输出流
            ByteArrayOutputStream bos =new ByteArrayOutputStream();
            // 将图像输出到输出流中。
            ImageIO.write(image,"jpeg", bos);
            MultipartFile multipartFile =new MockMultipartFile("test.jpeg","test.jpeg","", bos.toByteArray());
            if (urls.equals("")){
                urls = updateHead(multipartFile);
            }else{
                urls=urls+","+updateHead(multipartFile);
            }
        }
        return urls;
    }
}

Controller

@RestController
@RequestMapping("/a")
public class QRController {
    @Resource
    private InspectionPointService inspectionPointService;
    /**
     * 打印二维码
     * @param
     * @return
     */
    @GetMapping("PrintQRCode")
    public String PrintQRCode(@RequestParam(value ="pointId")String pointId, HttpServletResponse response)throws Exception {
        return inspectionPointService.PrintQRCode(pointId);
    }
}

返回的就是二维码图片的OSS路径地址,扫一扫可获得相应的 pointId(此id一般是自己定义的推广码,可以参考短域名id算法,一般在后台自己生成作为用户全局唯一的推广码)。

posted @ 2021-07-28 15:39  来日可期0726  阅读(956)  评论(0)    收藏  举报