Ver código fonte

修改上传二维码接口到minio

梁琛 2 semanas atrás
pai
commit
2b3e84af77

+ 2 - 3
container/bizApi/src/main/java/com/sixmac/service/impl/BizServiceImpl.java

@@ -120,9 +120,8 @@ public class BizServiceImpl extends BaseService<Biz> implements BizService {
 
             String name = "biz-qrCode-" + String.valueOf(System.currentTimeMillis()) + String.valueOf(Math.round(Math.random()*1000000));
             String uploadPath = UploadUtil.getUserQRCodeUpladPath();
-            String desFilePathName = uploadPath + name + ".jpg";
             String json = JSONArray.fromObject(list).toString();
-            QRCodeUtil.zxingCodeCreate(json, 300, 300, ConstConfig.UPLOADFILE_PATH + desFilePathName, "jpg");
+            String path= QRCodeUtil.zxingCodeCreate(json, 300, 300, name, "PNG");
 
 
             //创建推广关系
@@ -137,7 +136,7 @@ public class BizServiceImpl extends BaseService<Biz> implements BizService {
 //                }
 //            }
 
-            updateBy("qrCode=#{qrCode}", " id = #{id}", CMap.init().set("qrCode", ConstConfig.UPLOAD_PATH + desFilePathName).set("id", userId));
+            updateBy("qrCode=#{qrCode}", " id = #{id}", CMap.init().set("qrCode", path).set("id", userId));
             CacheKit.remove(ConstCache.SMS_CODE_CACHE, mobile + ConstCacheKey.BIZ_REGISTER_CODE);
             return this.auth(user, null);
         } else {

+ 44 - 13
container/common/src/main/java/com/sixmac/common/util/QRCodeUtil.java

@@ -5,6 +5,8 @@ import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
 import com.google.zxing.common.BitMatrix;
 import com.google.zxing.common.HybridBinarizer;
 import com.sixmac.common.vo.QRCodeImageBean;
+import com.sixmac.service.MinioUploadService;
+import com.sixmac.service.impl.MinioUploadServiceImpl;
 import com.swetake.util.Qrcode;
 import jp.sourceforge.qrcode.QRCodeDecoder;
 import jp.sourceforge.qrcode.exception.DecodingFailedException;
@@ -12,6 +14,8 @@ import jp.sourceforge.qrcode.exception.DecodingFailedException;
 import javax.imageio.ImageIO;
 import java.awt.*;
 import java.awt.image.BufferedImage;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.IOException;
 import java.util.HashMap;
@@ -38,13 +42,14 @@ public class QRCodeUtil {
      * @param text       二维码内容
      * @param width      二维码宽
      * @param height     二维码高
-     * @param outPutPath 二维码生成保存路径
+     * @param 文件名 name
      * @param imageType  二维码生成格式
      */
-    public static void zxingCodeCreate(String text, int width, int height, String outPutPath, String imageType) {
+    public static String zxingCodeCreate(String text, int width, int height, String name, String imageType) {
         Map<EncodeHintType, String> his = new HashMap<EncodeHintType, String>();
         //设置编码字符集
         his.put(EncodeHintType.CHARACTER_SET, "utf-8");
+        String path="";
         try {
             //1、生成二维码
             BitMatrix encode = new MultiFormatWriter().encode(text, BarcodeFormat.QR_CODE, width, height, his);
@@ -61,12 +66,14 @@ public class QRCodeUtil {
                     image.setRGB(i, j, encode.get(i, j) ? BLACK : WHITE);
                 }
             }
-            File outPutImage = new File(outPutPath);
-            //如果图片不存在创建图片
-            if (!outPutImage.exists())
-                outPutImage.createNewFile();
-            //5、将二维码写入图片
-            ImageIO.write(image, imageType, outPutImage);
+            String imageFormat = "PNG"; // 图像格式(需与MIME类型对应)
+            ByteArrayInputStream imageStream = convertToInputStream(image, imageFormat);
+
+            // 3. 获取流的字节长度(用于MinIO上传)
+            long contentLength = imageStream.available();
+            MinioUploadService minioUploadService=new MinioUploadServiceImpl();
+             path= minioUploadService.uploadQRCodeToMinIO(imageStream,name,contentLength);
+
         } catch (WriterException e) {
             e.printStackTrace();
             System.out.println("二维码生成失败");
@@ -74,6 +81,30 @@ public class QRCodeUtil {
             e.printStackTrace();
             System.out.println("生成二维码图片失败");
         }
+        return path;
+    }
+
+
+    /**
+     * 将BufferedImage转为输入流(ByteArrayInputStream)
+     * @param image 待转换的BufferedImage
+     * @param format 图像格式(如"PNG"、"JPG"、"JPEG")
+     * @return 转换后的输入流
+     * @throws IOException 流操作异常(如格式不支持)
+     */
+    public static ByteArrayInputStream convertToInputStream(BufferedImage image, String format) throws IOException {
+        // 1. 创建字节输出流,用于临时存储图像数据
+        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+
+        // 2. 将BufferedImage写入输出流(指定格式)
+        // 注意:format需为ImageIO支持的格式(如PNG、JPG),否则返回false且流为空
+        boolean isSuccess = ImageIO.write(image, format, outputStream);
+        if (!isSuccess) {
+            throw new IOException("不支持的图像格式:" + format);
+        }
+
+        // 3. 将输出流转为输入流(MinIO需要InputStream)
+        return new ByteArrayInputStream(outputStream.toByteArray());
     }
 
     /**
@@ -201,11 +232,11 @@ public class QRCodeUtil {
     public static void main(String[] args) {
 //        QRCodeCreate("hah", "D:\\test//qrcode.jpg", 15, "D:\\test//icon.png");
 //        zxingCodeCreate("ServiceOrderingOrderOrderingWeekly{id=1, createDate=2017-10-17 14:24:47, updateDate=2017-10-18 09:28:12, copies=2, deleteKey=1, weeklyId=1, orderId=1, status=2}", 300, 300, "E://zxingcode.jpg", "jpg");
+//
+//        String name = "code-"+String.valueOf(System.currentTimeMillis());
+//        String uploadPath = "D:\\xuxiang\\tomcat-house\\webapps\\files\\upload";
+//        String desFilePathName = uploadPath + name + ".jpg";
 
-        String name = "code-"+String.valueOf(System.currentTimeMillis());
-        String uploadPath = "D:\\xuxiang\\tomcat-house\\webapps\\files\\upload";
-        String desFilePathName = uploadPath + name + ".jpg";
-
-        zxingCodeCreate("ServiceOrderingOrderOrderingWeekly{id=1, createDate=2017-10-17 14:24:47, updateDate=2017-10-18 09:28:12, copies=2, deleteKey=1, weeklyId=1, orderId=1, status=2}", 300, 300, "D:\\xuxiang\\tomcat-house\\webapps\\files\\upload\\a.jpg", "jpg");
+        zxingCodeCreate("ServiceOrderingOrderOrderingWeekly{id=1, createDate=2017-10-17 14:24:47, updateDate=2017-10-18 09:28:12, copies=2, deleteKey=1, weeklyId=1, orderId=1, status=2}", 300, 300, "TTEESSTT.PNG", "PNG");
     }
 }

+ 10 - 0
container/common/src/main/java/com/sixmac/service/MinioUploadService.java

@@ -1,7 +1,17 @@
 package com.sixmac.service;
 
+import io.minio.errors.MinioException;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+
 public interface MinioUploadService {
     public String uploadSingleImage(MultipartFile file);
+
+    public String uploadQRCodeToMinIO(ByteArrayInputStream inputStream,
+                                      String objectName,
+                                      long contentLength) ;
 }

+ 46 - 0
container/common/src/main/java/com/sixmac/service/impl/MinioUploadServiceImpl.java

@@ -11,7 +11,11 @@ import org.springframework.web.multipart.MultipartRequest;
 
 import javax.annotation.PostConstruct;
 import javax.annotation.Resource;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
 import java.io.InputStream;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
@@ -135,4 +139,46 @@ public class MinioUploadServiceImpl implements MinioUploadService {
             return false;
         }
     }
+
+
+    /**
+     * 上传二维码输入流到MinIO
+     * @param inputStream 二维码输入流
+     * @param bucketName 桶名
+     * @param objectName 保存的文件名(如"qrcode/123.png")
+     * @param contentLength 流的长度(字节数)
+     * @throws MinioException MinIO操作异常
+     * @throws IOException 流操作异常
+     * @throws NoSuchAlgorithmException 加密算法异常
+     * @throws InvalidKeyException 密钥无效异常
+     */
+    @Override
+    public  String uploadQRCodeToMinIO(
+            ByteArrayInputStream inputStream,
+            String objectName,
+            long contentLength)  {
+          String bucketName="qrcode";
+          String path="";
+            try {
+                // 检查桶是否存在,不存在则创建
+                if (!minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build())) {
+                    minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
+                }
+
+                // 上传文件流
+                minioClient.putObject(
+                        PutObjectArgs.builder()
+                                .bucket(bucketName)
+                                .object(objectName)
+                                .stream(inputStream, contentLength, -1) // -1表示不限制分片大小(适合小文件)
+                                .contentType("image/png") // MIME类型(PNG格式)
+                                .build()
+                );
+                path=  endpoint + "/" + bucketName + "/" + objectName;
+                System.out.println("上传成功!路径:"+path);
+            }catch (Exception e){
+                e.printStackTrace();
+            }
+        return path;
+    }
 }

+ 2 - 4
container/sendApi/src/main/java/com/sixmac/service/impl/CourierServiceImpl.java

@@ -128,11 +128,9 @@ public class CourierServiceImpl extends BaseService<Courier> implements CourierS
             //生成一个唯一的二维码
 
             String name = "courier-qrCode-" + String.valueOf(System.currentTimeMillis()) + String.valueOf(Math.round(Math.random()*1000000));
-            String uploadPath = UploadUtil.getUserQRCodeUpladPath();
-            String desFilePathName = uploadPath + name + ".jpg";
             String json = JSONArray.fromObject(list).toString();
-            QRCodeUtil.zxingCodeCreate(json, 300, 300, ConstConfig.UPLOADFILE_PATH + desFilePathName, "jpg");
-            updateBy("qrCode=#{qrCode}", " id = #{id}", CMap.init().set("qrCode", ConstConfig.UPLOAD_PATH + desFilePathName).set("id", userId));
+            String path= QRCodeUtil.zxingCodeCreate(json, 300, 300, name, "PNG");
+            updateBy("qrCode=#{qrCode}", " id = #{id}", CMap.init().set("qrCode", path).set("id", userId));
 
             //创建推广关系
             commonInfoService.inviteShopUser(inviteCode, Long.valueOf(userId), 3);

+ 2 - 4
container/shopApi/src/main/java/com/sixmac/service/impl/ShopServiceImpl.java

@@ -174,12 +174,10 @@ public class ShopServiceImpl extends BaseService<Shop> implements ShopService {
                 //生成一个唯一的二维码
 
                 String name = "user-qrCode-" + String.valueOf(System.currentTimeMillis()) + String.valueOf(Math.round(Math.random()*1000000));
-                String uploadPath = UploadUtil.getUserQRCodeUpladPath();
-                String desFilePathName = uploadPath + name + ".jpg";
                 String json = JSONArray.fromObject(list).toString();
-                QRCodeUtil.zxingCodeCreate(json, 300, 300, ConstConfig.UPLOADFILE_PATH + desFilePathName, "jpg");
+                String path= QRCodeUtil.zxingCodeCreate(json, 300, 300, name, "PNG");
 
-                updateBy("qrCode=#{qrCode}", " id = #{id}", CMap.init().set("qrCode", ConstConfig.UPLOAD_PATH + desFilePathName).set("id", userId));
+                updateBy("qrCode=#{qrCode}", " id = #{id}", CMap.init().set("qrCode", path).set("id", userId));
                 user = findById(userId);
                 CacheKit.remove(ConstCache.SMS_CODE_CACHE, mobile + ConstCacheKey.REGISTER_CODE_USER);
                 if (StringUtils.isNotBlank(inviteCode)) {

+ 5 - 9
container/userApi/src/main/java/com/sixmac/service/impl/ClientUserServiceImpl.java

@@ -262,11 +262,9 @@ public class ClientUserServiceImpl extends BaseService<Client> implements Client
                 //生成一个唯一的二维码
 
                 String name = "user-qrCode-" + String.valueOf(System.currentTimeMillis()) + String.valueOf(Math.round(Math.random()*1000000));
-                String uploadPath = UploadUtil.getUserQRCodeUpladPath();
-                String desFilePathName = uploadPath + name + ".jpg";
                 String json = JSONArray.fromObject(list).toString();
-                QRCodeUtil.zxingCodeCreate(json, 300, 300, ConstConfig.UPLOADFILE_PATH + desFilePathName, "jpg");
-                updateBy("qrCode=#{qrCode}", " id = #{id}", CMap.init().set("qrCode", ConstConfig.UPLOAD_PATH + desFilePathName).set("id", userId));
+                String path = QRCodeUtil.zxingCodeCreate(json, 300, 300, name, "PNG");
+                updateBy("qrCode=#{qrCode}", " id = #{id}", CMap.init().set("qrCode", path).set("id", userId));
 
                 CacheKit.remove(ConstCache.SMS_CODE_CACHE, mobile + ConstCacheKey.CLIENT_REGISTER_CODE);
                 user.setId(Long.valueOf(userId));
@@ -471,14 +469,12 @@ public class ClientUserServiceImpl extends BaseService<Client> implements Client
         //生成一个唯一的二维码
 
         String name = "payCode_" + String.valueOf(System.currentTimeMillis()) + String.valueOf(Math.round(Math.random()*1000000));
-        String uploadPath = UploadUtil.getPayCodeUploadPath();
-        String desFilePathName = uploadPath + name + ".jpg";
         String json = JSONArray.fromObject(map).toString();
-        QRCodeUtil.zxingCodeCreate(json, 300, 300, ConstConfig.UPLOADFILE_PATH + desFilePathName, "jpg");
+        String path= QRCodeUtil.zxingCodeCreate(json, 300, 300, name, "png");
 
-        Db.save("t_client_salt","id",CMap.init().set("mobile",client.getMobile()).set("salt",salt + "_" + System.currentTimeMillis()).set("path",ConstConfig.UPLOAD_PATH + desFilePathName));
+        Db.save("t_client_salt","id",CMap.init().set("mobile",client.getMobile()).set("salt",salt + "_" + System.currentTimeMillis()).set("path",path));
 
-        return new AjaxResult().setData(getData("image",ConstConfig.UPLOAD_PATH + desFilePathName)) ;
+        return new AjaxResult().setData(getData("image",path)) ;
     }
 
     //认证

+ 2 - 4
container/userApi/src/main/java/com/sixmac/service/impl/GoodsOrderServiceImpl.java

@@ -249,12 +249,10 @@ public class GoodsOrderServiceImpl extends BaseService<GoodsOrder> implements Go
                 list.add(map);
                 //生成一个唯一的二维码
                 String filename = "orderQrCode-" + String.valueOf(System.currentTimeMillis()) + String.valueOf(Math.round(Math.random()*1000000));;
-                String uploadPath = UploadUtil.getRoomQRCodeUpladPath();
-                String desFilePathName = uploadPath + filename + ".jpg";
                 String json = JSONArray.fromObject(list).toString();
-                QRCodeUtil.zxingCodeCreate(json, 300, 300, ConstConfig.UPLOADFILE_PATH + desFilePathName, "jpg");
+                String path = QRCodeUtil.zxingCodeCreate(json, 300, 300, filename, "PNG");
                 String sql = "qrCode = #{qrCode}";
-                CMap param = CMap.init().set("qrCode", ConstConfig.UPLOAD_PATH + desFilePathName).set("id", order.get("orderId"));
+                CMap param = CMap.init().set("qrCode", path).set("id", order.get("orderId"));
 
                 GoodsOrder goodsOrder = findById(order.get("orderId"));
                 if (couponUserId != null && couponMoney.compareTo(new BigDecimal(0)) == 1) {