基础环境
SpringBoot、Maven
代码实现
1.添加依赖
1 2 3 4 5 6 7 8 9 10 11 |
<!--二维码生成 --> < dependency > < groupId >com.google.zxing</ groupId > < artifactId >core</ artifactId > < version >3.3.3</ version > </ dependency > < dependency > < groupId >com.google.zxing</ groupId > < artifactId >javase</ artifactId > < version >3.3.3</ version > </ dependency > |
2.工具类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 |
package com.milu.boss.common.util;
import cn.hutool.core.codec.Base64; import cn.hutool.core.util.StrUtil; import com.google.zxing.BarcodeFormat; import com.google.zxing.EncodeHintType; import com.google.zxing.common.BitMatrix; import com.google.zxing.qrcode.QRCodeWriter; import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component;
import javax.imageio.ImageIO; import javax.servlet.ServletOutputStream; import java.awt.*; import java.awt.geom.RoundRectangle2D; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; import java.net.URL; import java.util.HashMap;
/** * 链接二维码生成工具 * @author qzz */ @Slf4j @Component public class QrCodeUtil {
/** * 默认宽度 */ private static final Integer WIDTH = 140 ; /** * 默认高度 */ private static final Integer HEIGHT = 140 ;
/** * LOGO 默认宽度 */ private static final Integer LOGO_WIDTH = 22 ; /** * LOGO 默认高度 */ private static final Integer LOGO_HEIGHT = 22 ;
/** * 图片格式 */ private static final String IMAGE_FORMAT = "png" ; private static final String CHARSET = "utf-8" ; /** * 原生转码前面没有 data:image/png;base64 这些字段,返回给前端是无法被解析 */ private static final String BASE64_IMAGE = "data:image/png;base64,%s" ;
/** * 生成二维码,使用默认尺寸 * * @param content 内容 * @return */ public String getBase64QRCode(String content) { return getBase64Image(content, WIDTH, HEIGHT, null , null , null ); }
/** * 生成二维码,使用默认尺寸二维码,插入默认尺寸logo * * @param content 内容 * @param logoUrl logo地址 * @return */ public String getBase64QRCode(String content, String logoUrl) { return getBase64Image(content, WIDTH, HEIGHT, logoUrl, LOGO_WIDTH, LOGO_HEIGHT); }
/** * 生成二维码 * * @param content 内容 * @param width 二维码宽度 * @param height 二维码高度 * @param logoUrl logo 在线地址 * @param logoWidth logo 宽度 * @param logoHeight logo 高度 * @return */ public String getBase64QRCode(String content, Integer width, Integer height, String logoUrl, Integer logoWidth, Integer logoHeight) { return getBase64Image(content, width, height, logoUrl, logoWidth, logoHeight); }
private String getBase64Image(String content, Integer width, Integer height, String logoUrl, Integer logoWidth, Integer logoHeight) { ByteArrayOutputStream os = new ByteArrayOutputStream(); BufferedImage bufferedImage = crateQRCode(content, width, height, logoUrl, logoWidth, logoHeight); try { ImageIO.write(bufferedImage, IMAGE_FORMAT, os); } catch (IOException e) { log.error( "[生成二维码,错误{}]" , e); } // 转出即可直接使用 return String.format(BASE64_IMAGE, Base64.encode(os.toByteArray())); }
/** * 生成二维码 * * @param content 内容 * @param width 二维码宽度 * @param height 二维码高度 * @param logoUrl logo 在线地址 * @param logoWidth logo 宽度 * @param logoHeight logo 高度 * @return */ private BufferedImage crateQRCode(String content, Integer width, Integer height, String logoUrl, Integer logoWidth, Integer logoHeight) { if (StrUtil.isNotBlank(content)) { ServletOutputStream stream = null ; HashMap<EncodeHintType, Comparable> hints = new HashMap<>( 4 ); // 指定字符编码为utf-8 hints.put(EncodeHintType.CHARACTER_SET, CHARSET); // 指定二维码的纠错等级为中级 hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M); // 设置图片的边距 hints.put(EncodeHintType.MARGIN, 2 ); try { QRCodeWriter writer = new QRCodeWriter(); BitMatrix bitMatrix = writer.encode(content, BarcodeFormat.QR_CODE, width, height, hints); BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); for ( int x = 0 ; x < width; x++) { for ( int y = 0 ; y < height; y++) { bufferedImage.setRGB(x, y, bitMatrix.get(x, y) ? 0xFF000000 : 0xFFFFFFFF ); } } if (StrUtil.isNotBlank(logoUrl)) { insertLogo(bufferedImage, width, height, logoUrl, logoWidth, logoHeight); } return bufferedImage; } catch (Exception e) { e.printStackTrace(); } finally { if (stream != null ) { try { stream.flush(); stream.close(); } catch (IOException e) { e.printStackTrace(); } } } } return null ; }
/** * 二维码插入logo * * @param source 二维码 * @param width 二维码宽度 * @param height 二维码高度 * @param logoUrl logo 在线地址 * @param logoWidth logo 宽度 * @param logoHeight logo 高度 * @throws Exception */ private void insertLogo(BufferedImage source, Integer width, Integer height, String logoUrl, Integer logoWidth, Integer logoHeight) throws Exception { // logo 源可为 File/InputStream/URL Image src = ImageIO.read( new URL(logoUrl)); // 插入LOGO Graphics2D graph = source.createGraphics(); int x = (width - logoWidth) / 2 ; int y = (height - logoHeight) / 2 ; graph.drawImage(src, x, y, logoWidth, logoHeight, null ); Shape shape = new RoundRectangle2D.Float(x, y, logoWidth, logoHeight, 6 , 6 ); graph.setStroke( new BasicStroke(3f)); graph.draw(shape); graph.dispose(); }
/** * 获取二维码 * * @param content 内容 * @param output 输出流 * @throws IOException */ public void getQRCode(String content, OutputStream output) throws IOException { BufferedImage image = crateQRCode(content, WIDTH, HEIGHT, null , null , null ); ImageIO.write(image, IMAGE_FORMAT, output); }
/** * 获取二维码 * * @param content 内容 * @param logoUrl logo资源 * @param output 输出流 * @throws Exception */ public void getQRCode(String content, String logoUrl, OutputStream output) throws Exception { BufferedImage image = crateQRCode(content, WIDTH, HEIGHT, logoUrl, LOGO_WIDTH, LOGO_HEIGHT); ImageIO.write(image, IMAGE_FORMAT, output); } } |
3.测试生成
1 2 3 4 5 6 7 |
public static void main(String[] args) { QrCodeUtil qrCodeUtil= new QrCodeUtil(); String content= "https://www.baidu.com/" ; String logoUrl= "https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png" ; String url =qrCodeUtil.getBase64QRCode(content, logoUrl); System.out.println(url); } |
执行结果: Base64 字符串
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIwAAACMCAIAAAAhotZpAAACn0lEQVR42u3bQU7jMBQG4JYFtxhpWM6WA7CcO8MJuAYSiCPMCnUqWWNFGQlB/Z7tJt+vLtoqCYk/krw8zOEk0+dgCCAJJEgCSSBBEkgCCZJAgiSQBBIkgSSQIAkkaUI6JCRjf67+uCBBggQJ0rcOpud2vjIQLYM46rggQYIECVL8TkQNSsbNOXt/IEGCBAnSvpAyHkghQYIECRKkr24nu5EKCRIkSJC2iTQKuwVAFxwSJEiQtoOUMWFjhu/NFoIECRKk60DKTs9Bn3ocIEGCBAlS6kNozyZpy4NwzwIBEiRIkCDF3+RnmBDZgtHSJM0AgwQpf9pUxj5DakVKeg7bHVLLQPR5wOzTFJ6uwToK6bLRhDQvUpITJEh9kaJu5iH70Ni07VlEQIIECRKk3GIhoxl6/vjr/uX8StqHUV0SSJAgQVquW3kKFaTEouDiQy1I9bVa6+P9PbbBmlFobA3p5famvOrHsu5SqCzw/G/JujCkfkhLqvKxXO5WSPUNpCnOpIffr/W6t1rrfyFIMct8su7qFFka1Aqifl9PqT02WMci/Twelwz1crd8U7cDaQxSGfc/T4/nN293P1YF3upMKk4tNTekS67v370XJgltASnqRh2b9okxV99gnRwpZPYSpCykwClmkDrNC981UlQjMmNAs4uFlOszJEiQIEEanlFFREvhAwkSJEiQxhcOGTfkjJ8bVZi0FESQIEGCBGl8gzX7oThq+5stHCBBggRph0gZN/AZio5d/FcFJEiQIEEKLxB6TkqBBAkSJEj7Qspo/mY0l1Me9iFBggQJ0vAGa9QvR9QvUFRjFxIkSJAg5SL1bFxm/3EvuyELCRIkSJDikaRPIEESSJAEkkCCJJAEEiSBBEkgCSRIAkkgQRJIcvoLo2P+nGoPVwkAAAAASUVORK5CYII=
4.base64 转换为图片在线工具
https://tool.zhanid.com/t/pictobase64/
5.base64图片上传oss
5.1 base64图片 转 MultipartFile
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 |
package com.milu.boss.common.util;
/** * base64转multipartfile工具类 * @author qzz */ import org.springframework.web.multipart.MultipartFile; import sun.misc.BASE64Decoder; import java.io.*;
/** * base64转MultipartFile */ public class BASE64DecodedMultipartFile implements MultipartFile {
private final byte [] imgContent; private final String header;
/** * * @param imgContent * @param header */ public BASE64DecodedMultipartFile( byte [] imgContent, String header) { this .imgContent = imgContent; this .header = header.split( ";" )[ 0 ]; }
@Override public String getName() { return System.currentTimeMillis() + Math.random() + "." + header.split( "/" )[ 1 ]; }
@Override public String getOriginalFilename() { return System.currentTimeMillis() + ( int ) Math.random() * 10000 + "." + header.split( "/" )[ 1 ]; }
@Override public String getContentType() { return header.split( ":" )[ 1 ]; }
@Override public boolean isEmpty() { return imgContent == null || imgContent.length == 0 ; }
@Override public long getSize() { return imgContent.length; }
@Override public byte [] getBytes() throws IOException { return imgContent; }
@Override public InputStream getInputStream() throws IOException { return new ByteArrayInputStream(imgContent); }
@Override public void transferTo(File dest) throws IOException, IllegalStateException { new FileOutputStream(dest).write(imgContent); }
public static MultipartFile base64ToMultipart(String base64) { try { String[] baseStrs = base64.split( "," );
BASE64Decoder decoder = new BASE64Decoder(); byte [] b = new byte [ 0 ]; b = decoder.decodeBuffer(baseStrs[ 1 ]);
for ( int i = 0 ; i < b.length; ++i) { if (b[i] < 0 ) { b[i] += 256 ; } } return new BASE64DecodedMultipartFile(b, baseStrs[ 0 ]); } catch (IOException e) { e.printStackTrace(); return null ; } }
/** * base64 转 MultipartFile,获取对应的InputStream * @param base64 * @return */ public static InputStream getQrCodeInputStream(String base64){ MultipartFile multipartFile = BASE64DecodedMultipartFile.base64ToMultipart(base64); try { return multipartFile.getInputStream(); } catch (IOException e) { return null ; } } } |
base64图片转MultipartFile :
1 |
MultipartFile multipartFile = BASE64DecodedMultipartFile.base64ToMultipart(base64); |
5.2 MultipartFile 上传oss
1 2 3 4 5 6 7 8 9 10 11 12 13 |
/** * base64 转 MultipartFile,获取对应的InputStream * @param base64 * @return */ public static InputStream getQrCodeInputStream(String base64){ MultipartFile multipartFile = BASE64DecodedMultipartFile.base64ToMultipart(base64); try { return multipartFile.getInputStream(); } catch (IOException e) { return null ; } } |
图片流上传oos:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
/** * 图片流上传oos * @param fis * @return */ public String uploadImageUrl(InputStream fis){ String url = "" ; try { String fileExt = "png" ;; //生成新的文件名 String newfilename = "file/" ; Date now = new Date(); SimpleDateFormat date = new SimpleDateFormat( "yyyyMMdd" ); newfilename += date.format(now) + "/" ; SimpleDateFormat time = new SimpleDateFormat( "HHmmssSSS" ); newfilename += time.format(now); newfilename += "_" + new Random().nextInt( 1000 ) + "." + fileExt;
ossService.upload(newfilename, fis); url = "配置的阿里云OSS图片地址OSS_PIC_URL" + newfilename;
} catch (Exception e) { e.printStackTrace(); } return url; } |
ossService.upload:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
/** * 上传文件 */ public boolean upload(String filepath, InputStream inputstream) { boolean result = false ; // 初始化配置参数 String OSS_ENDPOINT = "阿里云 上传oss 配置的 ENDPOINT" ; String OSS_ACCESSKEYID = "阿里云 上传oss 配置的 CCESSKEYID" ; String OSS_ACCESSKEYSECRET = "阿里云 上传oss 配置的 ACCESSKEYSECRET" ; String OSS_BUCKET = "阿里云 上传oss 配置的 BUCKET" ; OSSClient ossClient = null ; try { if (filepath != null && ! "" .equals(filepath.trim())) { // 创建ClientConfiguration实例,按照您的需要修改默认参数 ClientConfiguration conf = new ClientConfiguration(); // 开启支持CNAME选项 conf.setSupportCname( true ); ossClient = new OSSClient(OSS_ENDPOINT, OSS_ACCESSKEYID, OSS_ACCESSKEYSECRET, conf);
// 上传 ossClient.putObject(OSS_BUCKET, filepath, inputstream); result = true ; } } catch (Exception e) { e.printStackTrace(); throw new RuntimeException( "文件上传异常" ); } finally { // 关闭client ossClient.shutdown(); } return result; } |
参考资料: https://zhuanlan.zhihu.com/p/158576491
到此这篇关于SpringBoot 二维码生成base64并上传OSS的实现示例的文章就介绍到这了,更多相关SpringBoot 二维码生成base64内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
原文链接:https://blog.csdn.net/qq_26383975/article/details/124818532
查看更多关于SpringBoot 二维码生成base64并上传OSS的实现示例的详细内容...