|
@@ -0,0 +1,163 @@
|
|
|
+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.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 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;
|
|
|
+
|
|
|
+
|
|
|
+/**
|
|
|
+ * 腾讯 COS 操作任务
|
|
|
+ *
|
|
|
+ * @author Cup
|
|
|
+ * @date 2022/4/15
|
|
|
+ */
|
|
|
+@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);
|
|
|
+ uploadAndCommpressImg(picName);
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ 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);
|
|
|
+ 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();
|
|
|
+ }
|
|
|
+ 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);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ File outFile = new File(outFilePath);
|
|
|
+ QcloudFileUtils.putFile(outFile, thumbName, publicBucketName, mimeType);
|
|
|
+
|
|
|
+ downFile.delete();
|
|
|
+ outFile.delete();
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+}
|