java生成二维码图片

Maven依赖
<!--生成二维码-->
<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>
Service 层方法实现

每一步注释写的很详细,很简单

@Service
public class ResumeSeedServiceImpl extends ServiceImpl<ResumeSeedMapper, ResumeSeed> implements IResumeSeedService {

    @Autowired
    private ResumeSeedMapper resumeSeedMapper;

    private static String FileNameManual = "seed_images";

    /**
     * 请求 url 中的资源映射,不推荐写死在代码中,最好提供可配置,如 /upload_flowChart/**
     */
    @Value("${uploadFile.resourceHandler}")
    private String resourceHandler;

    /**
     * 上传文件保存的本地目录,使用@Value获取全局配置文件中配置的属性值,如 D:\resume\file/
     */
    @Value("${uploadFile.location}")
    private String uploadImagesLocation;
/**
 * 根据userId生成二维码
 * @param userId 用户id
 * @return 返回二维码路径
 */
@Transactional
String qrCode(Long userId) {

    String fileName = BatchNumberUtils.getFileNameByDate(FileNameManual);
    //文件夹名
    File pathFile = new File(uploadImagesLocation+File.separator+fileName+File.separator);
    //图片名
    String picName = userId+"_img.jpg";
    //磁盘地址
    String path = uploadImagesLocation+File.separator+fileName+File.separator+picName;
    //数据库存储路径
    String dataPath = resourceHandler.substring(0,resourceHandler.length()-2)+ fileName + "/" + picName;
    //二维码内容
    String content ="服务器地址/25";
 /*
     * 图片的宽度和高度
     */
    int width = 300;
    int height = 300;
    // 图片的格式
    String format = "png";

    // 定义二维码的参数
    HashMap<EncodeHintType, Object> hints = new HashMap<EncodeHintType, Object>();
    // 定义字符集编码格式
    hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
    // 纠错的等级 L > M > Q > H 纠错的能力越高可存储的越少,一般使用M
    hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
    // 设置图片边距
    hints.put(EncodeHintType.MARGIN, 1);

    try {
        // 最终生成 参数列表 (1.内容 2.格式 3.宽度 4.高度 5.二维码参数)
        BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);
        if (!pathFile.exists()) {
            pathFile.mkdirs();
        }
        // 写入到本地
        Path file = new File(path).toPath();
        MatrixToImageWriter.writeToPath(bitMatrix, format, file);

    } catch (Exception e) {
        new CustomException("二维码存储失败", 400);
    }
    return dataPath;
}
}
二维码内容
String content ="服务器地址/25";

扫描二维码会跳到这个地址 ,如果内容是"www.baidu.com",则会跳到百度
二维码内容不建议写死,可以在yml中配置
二维码保存位置
在这里插入图片描述
数据库存放的路径
在这里插入图片描述
通过浏览器访问图片
localhost:9207/img/seed_images/20201111/25_img.jpg
在这里插入图片描述

工具类生成带日期的文件夹
public class BatchNumberUtils {

    private static final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
    private static final AtomicInteger atomicInteger = new AtomicInteger(1000000);

    /**
     * 创建不连续的订单号
     *
     * @param no 数据中心编号
     * @return 唯一的、不连续订单号
     */
    public static synchronized String getOrderNoByUUID(String no) {
        Integer uuidHashCode = UUID.randomUUID().toString().hashCode();
        if (uuidHashCode < 0) {
            uuidHashCode = uuidHashCode * (-1);
        }
        String date = simpleDateFormat.format(new Date());
        return no + date + uuidHashCode;
    }

    /**
     * 获取同一秒钟 生成的订单号连续
     *
     * @param no 数据中心编号
     * @return 同一秒内订单连续的编号
     */
    public static synchronized String getOrderNoByAtomic(String no) {
        atomicInteger.getAndIncrement();
        int i = atomicInteger.get();
        String date = simpleDateFormat.format(new Date());
        return no + date + i;
    }

    /**
     * 获取当前日期组成的文件名
     * @param name 文件名前缀
     * @return 组成的文件名
     */
    public static synchronized String getFileNameByDate(String name) {
        String date = dateFormat.format(new Date());
        return name +"/"+ date;
    }

}

编写一个虚拟映射器

虚拟映射相当于一个中转站, 从数据库里拿到相对路径映射器给映射到磁盘上,从而达到图片的访问

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {


   @Value("${uploadFile.resourceHandler}")
   private String resourceHandler;

   @Value("${uploadFile.location}")
   private String location;



   /**
    * 虚拟映射
    */
   @Override
   public void addResourceHandlers(ResourceHandlerRegistry registry) {

      // 就是说 url (http://localhost:8080/flow/upload_flowChart/xxxxxxx.jpg)
      //中出现 resourceHandler 匹配时,则映射到 location 中去,location 相当于虚拟的,被映射的路径
      // 映射本地文件时,开头必须是 file:/// 开头,表示协议
      registry.addResourceHandler(resourceHandler).addResourceLocations("file:///" + location);

   }

}

** Bootstrap.yml文件**

虚拟映射器设置图片保存路径

###上传文件配置 :该配置可根据部署的系统或开发人员自定义路径,每次部署之前需要修改location
uploadFile:
  resourceHandler: /img/**   #请求 url 中的资源映射也是保存到数据库中的父级路径

  location: D:\\resume\\file\\ #自定义上传文件服务器硬盘保存路径  ,linux服务器保存路径 /opt/java/resume/images

二维码生成完如何使用呢?二维码嵌套在模板上

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐