|
@@ -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();
|
|
|
-
|
|
|
-
|
|
|
- }
|
|
|
+ }
|
|
|
|
|
|
|
|
|
}
|