當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
SpringBoot 二维码生成base64并上传OSS
生活随笔
收集整理的這篇文章主要介紹了
SpringBoot 二维码生成base64并上传OSS
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
SpringBoot 二維碼生成base64并上傳OSS
基礎環境
SpringBoot、Maven
代碼實現
1.添加依賴
<!--二維碼生成 --> <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.工具類
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-8hints.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/URLImage src = ImageIO.read(new URL(logoUrl));// 插入LOGOGraphics2D 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.測試生成
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=base64 轉換為圖片在線工具
http://tool.chinaz.com/tools/imgtobase/
5.base64圖片上傳oss
5.1 base64圖片 轉 MultipartFile
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];}@Overridepublic String getName() {return System.currentTimeMillis() + Math.random() + "." + header.split("/")[1];}@Overridepublic String getOriginalFilename() {return System.currentTimeMillis() + (int) Math.random() * 10000 + "." + header.split("/")[1];}@Overridepublic String getContentType() {return header.split(":")[1];}@Overridepublic boolean isEmpty() {return imgContent == null || imgContent.length == 0;}@Overridepublic long getSize() {return imgContent.length;}@Overridepublic byte[] getBytes() throws IOException {return imgContent;}@Overridepublic InputStream getInputStream() throws IOException {return new ByteArrayInputStream(imgContent);}@Overridepublic 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 :
MultipartFile multipartFile = BASE64DecodedMultipartFile.base64ToMultipart(base64);5.2 MultipartFile 上傳oss
/*** 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:
/*** 圖片流上傳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:
/*** 上傳文件*/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 {// 關閉clientossClient.shutdown();}return result;}參考資料:https://zhuanlan.zhihu.com/p/158576491
總結
以上是生活随笔為你收集整理的SpringBoot 二维码生成base64并上传OSS的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: @ConfigurationProper
- 下一篇: pcre是什么