Browse Source

改成inputstream

chunping 3 years ago
parent
commit
d083dd8945

+ 35 - 83
mp-admin/src/main/java/com/qs/mp/web/controller/common/FileUploadController.java

@@ -1,10 +1,9 @@
 package com.qs.mp.web.controller.common;
 
 
-import com.alibaba.druid.sql.visitor.functions.If;
 import com.qs.mp.common.core.domain.AjaxResult;
 import com.qs.mp.common.enums.PicHandlerTypeEnum;
-import com.qs.mp.common.filter.ThumbnailsImgFilter;
+import com.qs.mp.common.image.CompressUtil;
 import com.qs.mp.common.qcloud.QcloudFileUtils;
 import com.qs.mp.common.utils.LogUtil;
 import com.qs.mp.common.utils.StringUtils;
@@ -13,11 +12,9 @@ import com.qs.mp.core.domain.LoginUser;
 import com.qs.mp.core.domain.UploadAttachment;
 import com.qs.mp.framework.security.handle.HostHolder;
 import java.awt.image.BufferedImage;
-import java.io.BufferedOutputStream;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.File;
-import java.io.FileOutputStream;
 import java.io.IOException;
 import javax.imageio.ImageIO;
 import net.coobird.thumbnailator.Thumbnails;
@@ -60,20 +57,9 @@ public class FileUploadController extends BaseApiController {
     @Value("${cloud.private-bucket-name}")
     private String privateBucketName;
 
-
     @Autowired
     protected HostHolder hostHolder;
 
-    private static final Integer ZERO = 0;
-    private static final Integer ONE_ZERO_TWO_FOUR = 1024;
-    private static final Integer NINE_ZERO_ZERO = 900;
-    private static final Integer THREE_TWO_SEVEN_FIVE = 3275;
-    private static final Integer TWO_ZERO_FOUR_SEVEN = 2047;
-    private static final Double ZERO_EIGHT_FIVE = 0.85;
-    private static final Double ZERO_SIX = 0.6;
-    private static final Double ZERO_FOUR_FOUR = 0.44;
-    private static final Double ZERO_FOUR = 0.4;
-
     /**
      * 文件上传
      * @param fileType 文件类型
@@ -254,18 +240,20 @@ public class FileUploadController extends BaseApiController {
         }
         String name = UUIDUtils.newId() + suffix;
         ByteArrayInputStream inputStream = null;
+        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
         try {
             QcloudFileUtils.putStream(file.getInputStream(), name, bucketName, mimeType );
-            /*BufferedImage bufferedImage = ImageIO.read(file.getInputStream());
+            BufferedImage bufferedImage = ImageIO.read(file.getInputStream());
             Builder<BufferedImage> builder = Thumbnails.of(bufferedImage);
 
 
             int pWidth = bufferedImage.getWidth();
             int pHeight = bufferedImage.getHeight();
+            double accuracy = CompressUtil.getAccuracy(file.getSize()/1024);
+            LogUtil.info(logger, "原始文件宽:{0},大小:{1},压缩比:{2}", pWidth, file.getSize()/1024, accuracy);
+//            builder.size(pWidth, pHeight);
 
-            builder.size(pWidth, pHeight);
-
-            String outFileDir = filePath+"/thumb";
+            /*String outFileDir = filePath+"/thumb";
             File tempFile = new File(outFileDir);
             if(!tempFile.exists()) {
                 tempFile.mkdirs();
@@ -275,14 +263,29 @@ public class FileUploadController extends BaseApiController {
 //            builder.toFile(outFilePath);
 
             // 压缩图片
-            /*if (pWidth > 500) {
+            if (pWidth > 500) {
                 float scale = 500f / pWidth;
-                Thumbnails.of(outFilePath).scale(scale).outputQuality(0.8f).toFile(outFilePath);
+                if ("image/png".equals(file.getContentType())) {
+                    Thumbnails.of(file.getInputStream()).scale(scale).outputQuality(accuracy)
+                        .imageType(BufferedImage.TYPE_INT_ARGB).outputFormat("png")
+                        .toOutputStream(outputStream);
+                } else {
+                    Thumbnails.of(file.getInputStream()).scale(scale).outputQuality(accuracy)
+                        .toOutputStream(outputStream);
+                }
             }else {
-                Thumbnails.of(outFilePath).scale(1f).outputQuality(0.8f).toFile(outFilePath);
-            }*/
-            byte[] outputBytes = compressPicForScale(file.getBytes(), file.getSize() * ONE_ZERO_TWO_FOUR);
-            inputStream = new ByteArrayInputStream(outputBytes);
+                if ("image/png".equals(file.getContentType())) {
+                    Thumbnails.of(file.getInputStream()).scale(1f).outputQuality(accuracy)
+                        .imageType(BufferedImage.TYPE_INT_ARGB).outputFormat("png")
+                        .toOutputStream(outputStream);
+                } else {
+                    Thumbnails.of(file.getInputStream()).scale(1f).outputQuality(accuracy)
+                        .toOutputStream(outputStream);
+                }
+            }
+            LogUtil.info(logger, "压缩后文件大小:{0}", outputStream.toByteArray().length / 1024);
+
+            inputStream = new ByteArrayInputStream(outputStream.toByteArray());
             QcloudFileUtils.putStream(inputStream, thumbName, bucketName, mimeType);
 
         }  catch (Exception e) {
@@ -293,69 +296,18 @@ public class FileUploadController extends BaseApiController {
                 try{
                     inputStream.close();
                 }catch (IOException e){
-                    LogUtil.error(log, e, "");
+                    LogUtil.error(log, e, "关闭输入流失败");
                 }
             }
-        }
-        return name;
-    }
-
-    /**
-     * 根据指定大小压缩图片
-     *
-     * @param imageBytes  源图片字节数组
-     * @param desFileSize 指定图片大小,单位kb
-     * @return 压缩质量后的图片字节数组
-     */
-    public static byte[] compressPicForScale(byte[] imageBytes, long desFileSize) {
-        if (imageBytes == null || imageBytes.length <= ZERO || imageBytes.length < desFileSize * ONE_ZERO_TWO_FOUR) {
-            return imageBytes;
-        }
-        long srcSize = imageBytes.length;
-        double accuracy = getAccuracy(srcSize / ONE_ZERO_TWO_FOUR);
-        try {
-
-            ByteArrayOutputStream outputStream = new ByteArrayOutputStream(imageBytes.length);
-            while (imageBytes.length > desFileSize * ONE_ZERO_TWO_FOUR) {
-                ByteArrayInputStream inputStream = null;
-                try {
-                 inputStream = new ByteArrayInputStream(imageBytes);
-                    Thumbnails.of(inputStream)
-                        .scale(accuracy)
-                        .outputQuality(accuracy)
-                        .toOutputStream(outputStream);
-                    imageBytes = outputStream.toByteArray();
-                } finally {
-                    if (null != inputStream) {
-                        inputStream.close();
-                    }
+            if (outputStream != null){
+                try{
+                    outputStream.close();
+                }catch (IOException e){
+                    LogUtil.error(log, e, "关闭输出流失败");
                 }
             }
-            LogUtil.info(log, "图片原大小={}kb | 压缩后大小={}kb",
-                srcSize / ONE_ZERO_TWO_FOUR, imageBytes.length / ONE_ZERO_TWO_FOUR);
-        } catch (Exception e) {
-            LogUtil.error(log, "【图片压缩】msg=图片压缩失败!", e);
         }
-        return imageBytes;
+        return name;
     }
 
-    /**
-     * 自动调节精度(经验数值)
-     *
-     * @param size 源图片大小
-     * @return 图片压缩质量比
-     */
-    private static double getAccuracy(long size) {
-        double accuracy;
-        if (size < NINE_ZERO_ZERO) {
-            accuracy = ZERO_EIGHT_FIVE;
-        } else if (size < TWO_ZERO_FOUR_SEVEN) {
-            accuracy = ZERO_SIX;
-        } else if (size < THREE_TWO_SEVEN_FIVE) {
-            accuracy = ZERO_FOUR_FOUR;
-        } else {
-            accuracy = ZERO_FOUR;
-        }
-        return accuracy;
-    }
 }

+ 89 - 0
mp-common/src/main/java/com/qs/mp/common/image/CompressUtil.java

@@ -0,0 +1,89 @@
+package com.qs.mp.common.image;
+
+import com.qs.mp.common.utils.LogUtil;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import net.coobird.thumbnailator.Thumbnails;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * 压缩工具类
+ *
+ * @author zhongcp
+ * @Date 2022/4/16
+ */
+public class CompressUtil {
+
+  protected static final Logger logger = LoggerFactory.getLogger(CompressUtil.class);
+
+  private static final Integer ZERO = 0;
+  private static final Integer ONE_ZERO_TWO_FOUR = 1024;
+  private static final Integer NINE_ZERO_ZERO = 200;
+  private static final Integer THREE_TWO_SEVEN_FIVE = 1000;
+  private static final Integer TWO_ZERO_FOUR_SEVEN = 500;
+  private static final Double ZERO_EIGHT_FIVE = 0.85;
+  private static final Double ZERO_SIX = 0.6;
+  private static final Double ZERO_FOUR_FOUR = 0.44;
+  private static final Double ZERO_FOUR = 0.4;
+
+  /**
+   * 根据指定大小压缩图片
+   *
+   * @param imageBytes  源图片字节数组
+   * @param desFileSize 指定图片大小,单位kb
+   * @return 压缩质量后的图片字节数组
+   */
+  public static byte[] compressPicForScale(byte[] imageBytes, long desFileSize) {
+    if (imageBytes == null || imageBytes.length <= ZERO
+        || imageBytes.length < desFileSize * ONE_ZERO_TWO_FOUR) {
+      return imageBytes;
+    }
+    long srcSize = imageBytes.length;
+    double accuracy = getAccuracy(srcSize / ONE_ZERO_TWO_FOUR);
+    try {
+
+      ByteArrayOutputStream outputStream = new ByteArrayOutputStream(imageBytes.length);
+      while (imageBytes.length > desFileSize * ONE_ZERO_TWO_FOUR) {
+        ByteArrayInputStream inputStream = null;
+        try {
+          inputStream = new ByteArrayInputStream(imageBytes);
+          Thumbnails.of(inputStream)
+              .scale(accuracy)
+              .outputQuality(accuracy)
+              .toOutputStream(outputStream);
+          imageBytes = outputStream.toByteArray();
+        } finally {
+          if (null != inputStream) {
+            inputStream.close();
+          }
+        }
+      }
+      LogUtil.info(logger, "图片原大小={}kb | 压缩后大小={}kb",
+          srcSize / ONE_ZERO_TWO_FOUR, imageBytes.length / ONE_ZERO_TWO_FOUR);
+    } catch (Exception e) {
+      LogUtil.error(logger, "【图片压缩】msg=图片压缩失败!", e);
+    }
+    return imageBytes;
+  }
+
+  /**
+   * 自动调节精度(经验数值)
+   *
+   * @param size 源图片大小
+   * @return 图片压缩质量比
+   */
+  public static double getAccuracy(long size) {
+    double accuracy;
+    if (size < NINE_ZERO_ZERO) {
+      accuracy = ZERO_EIGHT_FIVE;
+    } else if (size < TWO_ZERO_FOUR_SEVEN) {
+      accuracy = ZERO_SIX;
+    } else if (size < THREE_TWO_SEVEN_FIVE) {
+      accuracy = ZERO_FOUR_FOUR;
+    } else {
+      accuracy = ZERO_FOUR;
+    }
+    return accuracy;
+  }
+}

+ 1 - 1
mp-common/src/main/java/com/qs/mp/common/filter/ThumbnailsImgFilter.java → mp-common/src/main/java/com/qs/mp/common/image/ThumbnailsImgFilter.java

@@ -1,4 +1,4 @@
-package com.qs.mp.common.filter;
+package com.qs.mp.common.image;
 
 import java.awt.Color;
 import java.awt.Graphics2D;

+ 142 - 135
mp-quartz/src/main/java/com/qs/mp/quartz/task/CosTask.java

@@ -1,35 +1,32 @@
 package com.qs.mp.quartz.task;
 
-import cn.hutool.core.img.Img;
 import com.qcloud.cos.COSClient;
 import com.qcloud.cos.exception.CosClientException;
 import com.qcloud.cos.exception.CosServiceException;
-import com.qcloud.cos.model.*;
-import com.qs.mp.common.core.domain.AjaxResult;
-import com.qs.mp.common.enums.PicHandlerTypeEnum;
-import com.qs.mp.common.filter.ThumbnailsImgFilter;
+import com.qcloud.cos.model.COSObject;
+import com.qcloud.cos.model.COSObjectSummary;
+import com.qcloud.cos.model.GetObjectRequest;
+import com.qcloud.cos.model.ListObjectsRequest;
+import com.qcloud.cos.model.ObjectListing;
+import com.qcloud.cos.model.ObjectMetadata;
 import com.qs.mp.common.qcloud.QcloudFileUtils;
 import com.qs.mp.common.utils.LogUtil;
-import com.qs.mp.common.utils.StringUtils;
-import com.qs.mp.common.utils.UUIDUtils;
-import com.qs.mp.core.domain.LoginUser;
-import com.qs.mp.core.domain.UploadAttachment;
+import io.lettuce.core.output.ByteArrayOutput;
+import java.awt.image.BufferedImage;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.List;
+import javax.imageio.ImageIO;
 import net.coobird.thumbnailator.Thumbnails;
-import net.coobird.thumbnailator.geometry.Positions;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PutMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.multipart.MultipartFile;
-
-import javax.imageio.ImageIO;
-import java.awt.image.BufferedImage;
-import java.io.*;
-import java.util.ArrayList;
-import java.util.List;
 
 
 /**
@@ -41,127 +38,137 @@ import java.util.List;
 @Component("cosTask")
 public class CosTask {
 
-    protected final Logger logger = LoggerFactory.getLogger(this.getClass().getSimpleName());
-
-
-    /**
-     * 文件上传路径
-     */
-    @Value("${mp.profile}")
-    public String filePath;
-
-    /**
-     * 公开
-     */
-    @Value("${cloud.public-bucket-name}")
-    private String publicBucketName;
-
-
-    /**
-     * 腾讯COS图片压缩替换任务
-     */
-    public void compressPicture() throws IOException, InterruptedException {
-        LogUtil.info(logger, "...图片压缩替换任务开始...");
-
-        ListObjectsRequest listObjectsRequest = new ListObjectsRequest();
-        // 设置bucket名称
-        listObjectsRequest.setBucketName(publicBucketName);
-        // prefix表示列出的object的key以prefix开始
-        listObjectsRequest.setPrefix("/");
-        // deliter表示分隔符, 设置为/表示列出当前目录下的object, 设置为空表示列出所有的object
-        listObjectsRequest.setDelimiter("/");
-        // 设置最大遍历出多少个对象, 一次listobject最大支持1000
-        listObjectsRequest.setMaxKeys(500);
-        ObjectListing objectListing = null;
-        do {
-            try {
-                COSClient cosClient = QcloudFileUtils.getCosClient();
-                objectListing = cosClient.listObjects(listObjectsRequest);
-            } catch (CosServiceException e) {
-                e.printStackTrace();
-                return;
-            } catch (CosClientException e) {
-                e.printStackTrace();
-                return;
-            }
-            // common prefix表示表示被delimiter截断的路径, 如delimter设置为/, common prefix则表示所有子目录的路径
-            List<String> commonPrefixs = objectListing.getCommonPrefixes();
-
-            // object summary表示所有列出的object列表
-            List<COSObjectSummary> cosObjectSummaries = objectListing.getObjectSummaries();
-
-            for (COSObjectSummary cosObjectSummary : cosObjectSummaries) {
-                // 文件的路径key
-                String key = cosObjectSummary.getKey();
-
-                if (key.length() < 2) {
-                    continue;
-                }
-
-                if ("_s".equals(key.substring(key.length() - 2))) {
-              //  if("EJU6PLW0GUARR4EWIHZA.jpg_s".equals(key)) {
-                    // 获取原图文件名
-                    String picName = key.substring(0, key.length() - 2);
-                    System.err.println("key = " + picName);
-                    try {
-                        uploadAndCommpressImg(picName);
-                    } catch (Exception e) {
-                        System.err.println(e);
-                    }
-                }
-            }
-            String nextMarker = objectListing.getNextMarker();
-            listObjectsRequest.setMarker(nextMarker);
-        } while (objectListing.isTruncated());
-
-        LogUtil.info(logger, "...图片压缩替换完成!!...");
-    }
-
-    private void uploadAndCommpressImg(String key) throws IOException, InterruptedException {
-        String path = filePath + "/thumb/" + key;
-        File downFile = new File(path);
-        GetObjectRequest getObjectRequest = new GetObjectRequest(publicBucketName, key);
+  protected final Logger logger = LoggerFactory.getLogger(this.getClass().getSimpleName());
+
+
+  /**
+   * 文件上传路径
+   */
+  @Value("${mp.profile}")
+  public String filePath;
+
+  /**
+   * 公开
+   */
+  @Value("${cloud.public-bucket-name}")
+  private String publicBucketName;
+
+
+  /**
+   * 腾讯COS图片压缩替换任务
+   */
+  public void compressPicture() throws IOException, InterruptedException {
+    LogUtil.info(logger, "...图片压缩替换任务开始...");
+
+    ListObjectsRequest listObjectsRequest = new ListObjectsRequest();
+    // 设置bucket名称
+    listObjectsRequest.setBucketName(publicBucketName);
+    // prefix表示列出的object的key以prefix开始
+    listObjectsRequest.setPrefix("/");
+    // deliter表示分隔符, 设置为/表示列出当前目录下的object, 设置为空表示列出所有的object
+    listObjectsRequest.setDelimiter("/");
+    // 设置最大遍历出多少个对象, 一次listobject最大支持1000
+    listObjectsRequest.setMaxKeys(500);
+    ObjectListing objectListing = null;
+    do {
+      try {
         COSClient cosClient = QcloudFileUtils.getCosClient();
-        ObjectMetadata downObjectMeta = cosClient.getObject(getObjectRequest, downFile);
-//        FileInputStream fileInputStream = new FileInputStream(path);
-        String mimeType = "image/jpg";
-//        QcloudFileUtils.putStream(fileInputStream, key, publicBucketName, mimeType);
-
-        // 压缩图片
-        BufferedImage bufferedImage = ImageIO.read(downFile);
-        Thumbnails.Builder<BufferedImage> builder = Thumbnails.of(bufferedImage);
-        int pWidth = bufferedImage.getWidth();
-        int pHeight = bufferedImage.getHeight();
-        builder.size(pWidth, pHeight);
-
-        String outFileDir = filePath + "/thumb";
-        File tempFile = new File(outFileDir);
-        if (!tempFile.exists()) {
-            tempFile.mkdirs();
+        objectListing = cosClient.listObjects(listObjectsRequest);
+      } catch (CosServiceException e) {
+        e.printStackTrace();
+        return;
+      } catch (CosClientException e) {
+        e.printStackTrace();
+        return;
+      }
+      // common prefix表示表示被delimiter截断的路径, 如delimter设置为/, common prefix则表示所有子目录的路径
+      List<String> commonPrefixs = objectListing.getCommonPrefixes();
+
+      // object summary表示所有列出的object列表
+      List<COSObjectSummary> cosObjectSummaries = objectListing.getObjectSummaries();
+
+      for (COSObjectSummary cosObjectSummary : cosObjectSummaries) {
+        // 文件的路径key
+        String key = cosObjectSummary.getKey();
+
+        if (key.length() < 2) {
+          continue;
         }
-        String thumbName = key + "_s";
-        String outFilePath = filePath + "/thumb/" + thumbName + "." + mimeType.substring(mimeType.lastIndexOf("/") + 1);
-        builder.toFile(outFilePath);
 
-        // 压缩图片
-        if (pWidth > 500) {
-
-            float scale = 500f / pWidth;
-
-            Thumbnails.of(outFilePath).scale(scale).outputQuality(0.8f).toFile(outFilePath);
-        }else {
-            Thumbnails.of(outFilePath).scale(1f).outputQuality(0.8f).toFile(outFilePath);
+        if ("_s".equals(key.substring(key.length() - 2))) {
+          //  if("EJU6PLW0GUARR4EWIHZA.jpg_s".equals(key)) {
+          // 获取原图文件名
+          String picName = key.substring(0, key.length() - 2);
+          System.err.println("key = " + picName);
+          try {
+            uploadAndCommpressImg(picName);
+          } catch (Exception e) {
+            System.err.println(e);
+          }
         }
+      }
+      String nextMarker = objectListing.getNextMarker();
+      listObjectsRequest.setMarker(nextMarker);
+    } while (objectListing.isTruncated());
+
+    LogUtil.info(logger, "...图片压缩替换完成!!...");
+  }
+
+  private void uploadAndCommpressImg(String key) {
+    String path = filePath + "/thumb/" + key;
+    File downFile = new File(path);
+    GetObjectRequest getObjectRequest = new GetObjectRequest(publicBucketName, key);
+    COSClient cosClient = QcloudFileUtils.getCosClient();
+    ObjectMetadata cosObjectmetadata = cosClient.getObject(getObjectRequest, downFile);
+    String mimeType = cosObjectmetadata.getContentType();
+    ByteArrayInputStream inputStream = null;
+    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+    // 压缩图片
+    try {
+      BufferedImage bufferedImage = ImageIO.read(downFile);
+      Thumbnails.Builder<BufferedImage> builder = Thumbnails.of(bufferedImage);
+      int pWidth = bufferedImage.getWidth();
+      int pHeight = bufferedImage.getHeight();
+      String thumbName = key + "_s";
+
+      // 压缩图片
+      if (pWidth > 500) {
+        float scale = 500f / pWidth;
+        Thumbnails.of(downFile).scale(scale).outputQuality(0.8f).toOutputStream(outputStream);
+      } else {
+        Thumbnails.of(downFile).scale(1f).outputQuality(0.8f).toOutputStream(outputStream);
+      }
+      inputStream = new ByteArrayInputStream(outputStream.toByteArray());
+      QcloudFileUtils.putStream(inputStream, thumbName, publicBucketName, mimeType);
+
+    } catch (Exception e) {
+      LogUtil.error(logger, e, "图片压缩上传异常");
+    } finally {
+      if (inputStream != null) {
+        try {
+          inputStream.close();
+        } catch (IOException e) {
+          LogUtil.error(logger, e, "关闭输入流失败");
+        }
+      }
+      if (outputStream != null) {
+        try {
+          outputStream.close();
+        } catch (IOException e) {
+          LogUtil.error(logger, e, "关闭输出流失败");
+        }
+      }
+//      if (cosObject != null) {
+//        try {
+//          cosObject.close();
+//        } catch (IOException e) {
+//          LogUtil.error(logger, e, "关闭cos对象失败");
+//        }
+//      }
+    }
 
 
-        File outFile = new File(outFilePath);
-        QcloudFileUtils.putFile(outFile, thumbName, publicBucketName, mimeType);
-
-        downFile.delete();
-        outFile.delete();
-
-
-    }
+  }
 
 
 }