最近公司要做一个用户邀请的功能,生成二维码邀请用户就能获得积分奖励。于是就开发了一个小功能,二维码可以保存在本地,也可以利用FastFileStorage上传到文件服务器。

pom文件用到的包

<!-- zxing生成二维码 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>${zxing-core.version}</version></dependency><dependency><groupId>com.google.zxing</groupId><artifactId>javase</artifactId><version>${zxing-javase.version}</version></dependency><!-- 上传文件服务器 --><dependency><groupId>com.github.tobato</groupId><artifactId>fastdfs-client</artifactId><version>1.26.5</version></dependency>

二维码生成代码 QRCodeUtil 如下

import com.github.tobato.fastdfs.domain.fdfs.StorePath;
import com.github.tobato.fastdfs.service.FastFileStorageClient;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;
import javax.imageio.ImageIO;
import javax.swing.filechooser.FileSystemView;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;/*** 二维码生成器* @Author ztz* @Date 2022年12月12日  18:04* @Version 1.0*/
@Component
public class QRCodeUtil {private static final String FileFormat=".png";/** 本地目录*/@Value("${accessFile.location}")private  String location;private static String staticLocation;@Autowiredprivate FastFileStorageClient storageClient;@Autowiredprivate static FastFileStorageClient staticStorageClient;/**静态方法不能直接使用 @Value,所以采用 @PostConstruct方式引用*/@PostConstructpublic void init() {staticStorageClient = storageClient;staticLocation =location;}public static String httpUrl = "你的文件服务器地址";//CODE_WIDTH:二维码宽度,单位像素private static final int CODE_WIDTH = 100;//CODE_HEIGHT:二维码高度,单位像素private static final int CODE_HEIGHT = 100;//FRONT_COLOR:二维码前景色,0x000000 表示黑色private static final int FRONT_COLOR = 0x000000;//BACKGROUND_COLOR:二维码背景色,0xFFFFFF 表示白色//演示用 16 进制表示,和前端页面 CSS 的取色是一样的,注意前后景颜色应该对比明显,如常见的黑白private static final int BACKGROUND_COLOR = 0xFFFFFF;/*** 生成二维码到本地* @param content  二维码内容。一般是一个链接@param folderName   生成的文件目录* @return*/public static String createCodeToFile(String content,String folderName) {try {File codeImgFileSaveDir = new File(staticLocation+folderName);//1. 使用UUID重新生成文件名,防止文件名称重复造成文件覆盖String fileName = UUID.randomUUID()  + "." +FileFormat;content = content.trim();if (codeImgFileSaveDir==null || codeImgFileSaveDir.isFile()) {//二维码图片存在目录为空,默认放在桌面...codeImgFileSaveDir = FileSystemView.getFileSystemView().getHomeDirectory();}if (!codeImgFileSaveDir.exists()) {//二维码图片存在目录不存在,开始创建...codeImgFileSaveDir.mkdirs();}//核心代码-生成二维码BufferedImage bufferedImage = getBufferedImage(content);File codeImgFile = new File(codeImgFileSaveDir, fileName);ImageIO.write(bufferedImage, "png", codeImgFile);return folderName+fileName;} catch (Exception e) {e.printStackTrace();}return null;}/***  生成二维码的流文件并保存到文件服务器* @param content  :二维码内容*/public static String createCodeToOutputStream(String content) {String url = null;try {if (StringUtils.isBlank(content)) {return url;}content = content.trim();//核心代码-生成二维码BufferedImage bufferedImage = getBufferedImage(content);//以流的方式将图片上传到fastdfs上:ByteArrayOutputStream outputStream = new ByteArrayOutputStream();ImageIO.write(bufferedImage, "png", outputStream);InputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());StorePath storePath = staticStorageClient.uploadFile(inputStream,inputStream.available(),"png",null);if(storePath!=null) {url = httpUrl+storePath.getFullPath();}} catch (Exception e) {e.printStackTrace();}return url;}//核心代码-生成二维码private static BufferedImage getBufferedImage(String content) throws WriterException {//com.google.zxing.EncodeHintType:编码提示类型,枚举类型Map<EncodeHintType, Object> hints = new HashMap();//EncodeHintType.CHARACTER_SET:设置字符编码类型hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");//EncodeHintType.ERROR_CORRECTION:设置误差校正//ErrorCorrectionLevel:误差校正等级,L = ~7% correction、M = ~15% correction、Q = ~25% correction、H = ~30% correction//不设置时,默认为 L 等级,等级不一样,生成的图案不同,但扫描的结果是一样的hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);//EncodeHintType.MARGIN:设置二维码边距,单位像素,值越小,二维码距离四周越近hints.put(EncodeHintType.MARGIN, 1);MultiFormatWriter multiFormatWriter = new MultiFormatWriter();BitMatrix bitMatrix = multiFormatWriter.encode(content, BarcodeFormat.QR_CODE, CODE_WIDTH, CODE_HEIGHT, hints);BufferedImage bufferedImage = new BufferedImage(CODE_WIDTH, CODE_HEIGHT, BufferedImage.TYPE_INT_BGR);for (int x = 0; x < CODE_WIDTH; x++) {for (int y = 0; y < CODE_HEIGHT; y++) {bufferedImage.setRGB(x, y, bitMatrix.get(x, y) ? FRONT_COLOR : BACKGROUND_COLOR);}}return bufferedImage;}

利用redis的incr生成唯一邀请码序列,也可以配合时间和uuid等参数生成唯一订单

/*** 递增* * @param key 键* @param delta  要增加几(大于0)* @return*/public long incr(String key, long delta) {if (delta < 0) {throw new RuntimeException("递增因子必须大于0");}return redisTemplate.opsForValue().increment(key, delta);}

文件存放在本地的话记得别忘了配置静态资源访问路径,记得shiro里也要放行

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {//匹配url 中的资源映射@Value("${accessFile.resourceHandler}")private String resourceHandler;//上传文件保存的本地目录@Value("${accessFile.location}")private String location;/*** 配置静态资源映射** @param registry*/@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {//匹配到resourceHandler,将URL映射至location,也就是本地文件夹registry.addResourceHandler(resourceHandler).addResourceLocations("file:" + location);}/*** 跨域* @param registry*/@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**").allowedOriginPatterns("*").allowCredentials(true).allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS").maxAge(3600);}}/*** 递增* * @param key 键* @param delta  要增加几(大于0)* @return*/public long incr(String key, long delta) {if (delta < 0) {throw new RuntimeException("递增因子必须大于0");}return redisTemplate.opsForValue().increment(key, delta);}

JAVA 生成二维码并保存到本地或文件服务器相关推荐

  1. VUE微信H5生成二维码海报保存在本地相册

    VUE微信H5生成二维码海报保存在本地相册 一.效果 二.说明 公司需求:宣传海报从后台获取,二维码地址也从后台获得,然后生成一个海报,海报上固定位置放二维码,长按图片可以保存在本地相册(其实前面的需 ...

  2. java根据内容生成二维码并保存到本地

    /*** ClassName:Base64Util.java* Date:2020年2月27日*/ package com.sh.untils;import com.google.zxing.Barc ...

  3. 二维码相关---java生成二维码名片,并且自动保存到手机通讯录中...

    二维码相关---java生成二维码名片,并且自动保存到手机通讯录中... 技术qq交流群:JavaDream:251572072 1.首先介绍一个api.   Zxing是Google提供的关于条码 ...

  4. 二维码相关---java生成二维码名片,而且自己主动保存到手机通讯录中...

    版权声明:本文为博主原创文章,未经博主credreamer 同意不得转载 违者追究法律责任. https://blog.csdn.net/lidew521/article/details/244418 ...

  5. java 生成二维码 QRCode、zxing 两种方式

    版权声明:本文为 testcs_dn(微wx笑) 原创文章,非商用自由转载-保持署名-注明出处,谢谢. https://blog.csdn.net/testcs_dn/article/details/ ...

  6. Java生成二维码带LOGO底部标题竖版字体

    前言 Java后端生成二维码 底部 侧面带有标题,可调节字号 参考文章 使用Java生成二维码图片(亲测) Reborn_YY使用Java生成二维码图片 图标素材库 Java后台生成图片,前台实现图片 ...

  7. java生成二维码(链接生成二维码)

    Java二维码如何生成? awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; import com. ...

  8. java生成二维码到文件,java生成二维码转成BASE64

    java生成二维码到文件,java生成二维码转成BASE64 如题,利用java和第三方库,把指定的字符串生成二维码,并且把二维码保存成图片,转换成BASE64格式. 需要的jar文件: packag ...

  9. 使用Java生成二维码

    二维码应该称为二维条码,扫描之后可以获得更多数据 QR码全称为快速响应矩阵码,1994年日本一个公司发明 黑色表示1,白色表示0 3个角落比较像"回"字,叫定位点 容错机制,当7% ...

最新文章

  1. 【Linux】一步一步学Linux——arpwatch命令(165)
  2. 【Verilog HDL】从逻辑电路图到门级建模——人工翻译的方法论
  3. 英特尔核显自定义分辨率_让免费的核显更好用!英特尔酷睿集成的GPU如何优化?...
  4. 大数据技术之 Kafka (第 4 章 Kafka API ) Producer API
  5. 基于WDF的PCI/PCIe接口卡Windows驱动程序(3)- 驱动程序代码(头文件)
  6. WaveShaperNode
  7. ORB-SLAM2双目开源框架 (2) Tracking解析
  8. Xpath--使用Xpath爬取糗事百科成人版图片
  9. rzsz工具 源码交叉编译
  10. 工厂中用计算机,计算机技术在工厂监控系统中的应用
  11. 激活出现 错误0x800706F7 占位程序接收到错误数据
  12. Gillmeister Automatic PDF Processor(PDF文件自动处理工具)官方正式版V1.12.3 | pdf自动打印管理软件下载
  13. 爬虫抓图全网最新方法,这一次终于是4k高清美图,只因为我不下载JPG图片!
  14. java中的implement怎么用?
  15. java 判断是否为英文字母_java判断是否是26个英文字母代码示例
  16. 2019年会总结+自我反思
  17. 投资笔记4-投资风险认知
  18. 在JDBC中实现SQL语句的模糊查询
  19. Django搭建简单网站
  20. [C++]接口继承与实现继承

热门文章

  1. KNOWN_HOSTS处理
  2. 从零开始的MSP430单片机学习(一)
  3. oracle cheatsheet,OracleDB Cheatsheet
  4. Android静态安全检查(九):不安全的SDCard存储检测
  5. 网课答案题库系统 内含接口使用
  6. 天使投资AI、风险投资VC、私募股权投资PE、投行IB、FOF、普通合伙人GP、有限合伙人LP、PIPE
  7. Springboot中使用Shiro的配置与realm的构建
  8. FIR滤波器窗口设计法和频率采样设计法
  9. ug10.0许可证服务器失败,ug10.0许可错误
  10. Ribbon与Eureka整合分析(四)、客户端配置延迟加载和启用饥饿加载