好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

SpringBoot 二维码生成base64并上传OSS的实现示例

基础环境

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的实现示例的详细内容...

  阅读:26次