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

最近公司要做一个用户邀请的功能,生成二维码邀请用户就能获得积分奖励。于是就开发了一个小功能,二维码可以保存在本地,也可以利用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";
    /** 本地目录,这里是配置在yml或者xml文件里的地址,可以是服务器本身的目录(需要权限放行)或者oos服务器地址*/
    @Value("${accessFile.location}")
    private  String location;

    private static String staticLocation;

    @Autowired
    private FastFileStorageClient storageClient;

    @Autowired
    private static FastFileStorageClient staticStorageClient;
	/**静态方法不能直接使用 @Value,所以采用 @PostConstruct方式引用*/
    @PostConstruct
    public 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
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        //匹配到resourceHandler,将URL映射至location,也就是本地文件夹
        registry.addResourceHandler(resourceHandler).addResourceLocations("file:" + location);
    }


    /**
     * 跨域
     * @param registry
     */
    @Override
    public 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);
	}

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 如果你想将图片转换成二维码并上传到OSS服务器,你可以使用以下步骤: 1. 安装必要的依赖库。你需要安装 `pyqrcode` 和 `boto3` 库来生成二维码和连接到OSS服务器。你可以使用以下命令安装这些库: ``` pip install pyqrcode boto3 ``` 2. 生成二维码。你可以使用 `pyqrcode` 库来生成二维码。例如,你可以使用以下代码生成一个包含文本 `hello world` 的二维码: ```python import pyqrcode qr = pyqrcode.create('hello world') ``` 3. 将二维码保存文件中。你可以使用 `save` 方法将二维码保存文件中。例如,你可以使用以下代码将二维码保存为 `qrcode.png` 文件: ```python qr.png('qrcode.png', scale=8) ``` 4. 连接到OSS服务器。你可以使用 `boto3` 库来连接到OSS服务器。首先,你需要在OSS控制台中获取你的访问密钥和密钥ID。然后,你可以使用以下代码连接到OSS服务器: ```python import boto3 # Replace with your access key and secret key ACCESS_KEY = 'your access key' SECRET_KEY = 'your secret key' # Connect to the OSS server oss = boto3.client( 's3', aws_access_key_id=ACCESS_KEY, aws_secret_access_key=SECRET_KEY, ) ``` 5. 上传文件。你可以使用 `upload_file` 方法将 ### 回答2: 要实现将图片转成二维码并上传到OSS服务器,可以通过以下步骤完成。 首先,我们需要选择一个合适的开发工具来实现图片转二维码功能。常用的工具有Python的qrcode库,Java的zxing(Zebra Crossing)库等。 接下来,我们需要下载并安装选定的开发工具,并在项目中导入相关的库和依赖项。 然后,我们需要编写代码来实现图片转二维码的功能。代码中需要将图片加载进内存,并使用二维码库将其转换成二维码。转换完成后,可以将二维码保存为图片文件,或者直接将其存储在内存中。 接下来,我们需要连接到OSS服务器,并在其中创建一个存储图片的目录。需要使用连接OSS服务器的相关信息,例如访问URL、Access Key等。 然后,我们需要将生成的二维码上传至OSS服务器。可以使用选定的开发工具提供的上传功能,将二维码文件上传至指定目录。 最后,我们可以在OSS服务器上验证上传是否成功,通过访问相应的URL来获取二维码图片。 综上所述,要实现图片转成二维码并上传到OSS服务器,需要选择合适的开发工具,编写代码来实现图片转二维码功能,连接OSS服务器并上传二维码文件。只要按照以上步骤进行操作,就可以将图片转成二维码并存储到OSS服务器上。 ### 回答3: 要将图片转成二维码并上传到OSS服务器,需要以下步骤: 首先,需要安装一个二维码生成库。可以选择使用Python的qrcode库来生成二维码。可以使用pip命令安装: ``` pip install qrcode ``` 然后,导入qrcode库,并使用库的make函数生成二维码。将要转换的图片作为输入参数传递给make函数,生成二维码对象。 ```python import qrcode image_path = 'image.jpg' qr = qrcode.make(image_path) ``` 接下来,需要将生成的二维码保存为图片文件。可以使用二维码对象的save函数保存为图片。 ```python qr.save('qrcode.png') ``` 生成的二维码图片可以进行进一步操作,如调整大小、添加logo等。然后,将生成的二维码图片上传到阿里云OSS服务器,可以使用阿里云的Python SDK。 首先,需要安装阿里云的Python SDK。可以使用pip命令安装。 ``` pip install aliyun-python-sdk-core-v3 ``` 然后,导入阿里云的Python SDK,并进行相关的配置。 ```python from aliyunsdkcore import client access_key_id = 'your_access_key_id' access_secret = 'your_access_secret' endpoint = 'your_oss_endpoint' bucket = 'your_bucket_name' clt = client.AcsClient(access_key_id, access_secret, endpoint) ``` 接下来,使用OSS的BucketManager对象上传二维码图片。 ```python from aliyunsdkcore.request import CommonRequest request = CommonRequest() request.set_accept_format('json') request.set_domain(endpoint) request.set_method('PUT') request.set_protocol_type('https') request.set_bucket_name(bucket) request.set_key('qrcode.png') # 设置上传后的文件名 request.set_input_file('qrcode.png') # 设置要上传的文件路径 response = clt.do_action(request) ``` 以上就是将图片转成二维码并上传到OSS服务器的步骤。注意替换代码中的相应配置信息,确保代码正常运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值