1. 依赖
<!--腾讯云存储--><dependency><groupId>com.qcloud</groupId><artifactId>cos_api</artifactId><version>5.6.45</version></dependency><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.2.2</version></dependency><!--腾讯云--><dependency><groupId>com.tencentcloudapi</groupId><artifactId>tencentcloud-sdk-java</artifactId><version>3.1.416</version></dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId></dependency>
2. 工具类
package com.example.emos.api.oss;import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.IdUtil;import com.example.emos.api.exception.EmosException;
import com.qcloud.cos.COSClient;
import com.qcloud.cos.ClientConfig;
import com.qcloud.cos.auth.BasicCOSCredentials;
import com.qcloud.cos.auth.COSCredentials;
import com.qcloud.cos.http.HttpMethodName;
import com.qcloud.cos.http.HttpProtocol;
import com.qcloud.cos.model.*;
import com.qcloud.cos.model.ciModel.auditing.ImageAuditingRequest;
import com.qcloud.cos.model.ciModel.auditing.ImageAuditingResponse;
import com.qcloud.cos.region.Region;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;import java.io.IOException;
import java.net.URL;
import java.util.*;/*** 腾讯云存储工具类封装(COS+数据万象)** @author gblfy* @date 2022-12-05*/
@Component
public class CosUtils {@Value("${tencent.cloud.appId}")private String appId;@Value("${tencent.cloud.secretId}")private String secretId;@Value("${tencent.cloud.secretKey}")private String secretKey;@Value("${tencent.cloud.region-public}")private String regionPublic;@Value("${tencent.cloud.bucket-public}")private String bucketPublic;@Value("${tencent.cloud.region-private}")private String regionPrivate;@Value("${tencent.cloud.bucket-private}")private String bucketPrivate;//获取访问公有存储桶的连接private COSClient getCosPublicClient() {COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);ClientConfig clientConfig = new ClientConfig(new Region(regionPublic));clientConfig.setHttpProtocol(HttpProtocol.https);COSClient cosClient = new COSClient(cred, clientConfig);return cosClient;}//获得访问私有存储桶的连接private COSClient getCosPrivateClient() {COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);ClientConfig clientConfig = new ClientConfig(new Region(regionPrivate));clientConfig.setHttpProtocol(HttpProtocol.https);COSClient cosClient = new COSClient(cred, clientConfig);return cosClient;}/*** 向公有存储桶上传文件(数据万象对上传图片审核)** @param file 前端上传的文件* @param path 文件上传的腾讯云存储路径(按照类型存储到不同的分类下的文件中下面)* @return* @throws IOException*/public HashMap uploadPublicFile(MultipartFile file, String path) throws IOException {String fileName = file.getOriginalFilename(); //上传文件的名字String fileType = fileName.substring(fileName.lastIndexOf(".")); //文件后缀名path += IdUtil.simpleUUID() + fileType; //避免重名图片在云端覆盖,所以用UUID作为文件名//元数据信息ObjectMetadata meta = new ObjectMetadata();meta.setContentLength(file.getSize());meta.setContentEncoding("UTF-8");meta.setContentType(file.getContentType());//向存储桶中保存文件PutObjectRequest putObjectRequest = new PutObjectRequest(bucketPublic, path, file.getInputStream(), meta);putObjectRequest.setStorageClass(StorageClass.Standard); //标准存储COSClient client = getCosPublicClient();PutObjectResult putObjectResult = client.putObject(putObjectRequest);//合成外网访问地址HashMap map = new HashMap();map.put("url", "https://" + bucketPublic + ".cos." + regionPublic + ".myqcloud.com" + path);map.put("path", path);client.shutdown();return map;}/*** 向公有存储桶上传文件(数据万象对上传图片审核)** @param file 前端上传的文件* @param path 文件上传的腾讯云存储路径(按照类型存储到不同的分类下的文件中下面)* @return* @throws IOException*/public HashMap uploadPublicFileAndCloudInfinite(MultipartFile file, String path) throws IOException {String fileName = file.getOriginalFilename(); //上传文件的名字String fileType = fileName.substring(fileName.lastIndexOf(".")); //文件后缀名path += IdUtil.simpleUUID() + fileType; //避免重名图片在云端覆盖,所以用UUID作为文件名//元数据信息ObjectMetadata meta = new ObjectMetadata();meta.setContentLength(file.getSize());meta.setContentEncoding("UTF-8");meta.setContentType(file.getContentType());//向存储桶中保存文件PutObjectRequest putObjectRequest = new PutObjectRequest(bucketPublic, path, file.getInputStream(), meta);putObjectRequest.setStorageClass(StorageClass.Standard); //标准存储COSClient client = getCosPublicClient();PutObjectResult putObjectResult = client.putObject(putObjectRequest);//合成外网访问地址HashMap map = new HashMap();map.put("url", "https://" + bucketPublic + ".cos." + regionPublic + ".myqcloud.com" + path);map.put("path", path);//如果保存的是图片,用数据万象服务对图片内容审核if (List.of(".jpg", ".jpeg", ".png", ".gif", ".bmp").contains(fileType)) {//审核图片内容ImageAuditingRequest request = new ImageAuditingRequest();request.setBucketName(bucketPublic);request.setDetectType("porn,terrorist,politics,ads"); //辨别黄色、暴利、政治和广告内容request.setObjectKey(path);ImageAuditingResponse response = client.imageAuditing(request); //执行审查if (!response.getPornInfo().getHitFlag().equals("0")|| !response.getTerroristInfo().getHitFlag().equals("0")|| !response.getAdsInfo().getHitFlag().equals("0")) {//删除违规图片client.deleteObject(bucketPublic, path);throw new EmosException("图片内容不合规");}}client.shutdown();return map;}/*** 向私有存储桶上传文件** @param file 前端上传的文件* @param path 文件上传的腾讯云存储路径(按照类型存储到不同的分类下的文件中下面)* @return* @throws IOException*/public HashMap uploadPrivateFile(MultipartFile file, String path) throws IOException {String fileName = file.getOriginalFilename(); //上传文件的名字String fileType = fileName.substring(fileName.lastIndexOf(".")); //文件后缀名path += IdUtil.simpleUUID() + fileType; //避免重名图片在云端覆盖,所以用UUID作为文件名//元数据信息ObjectMetadata meta = new ObjectMetadata();meta.setContentLength(file.getSize());meta.setContentEncoding("UTF-8");meta.setContentType(file.getContentType());//向存储桶中保存文件PutObjectRequest putObjectRequest = new PutObjectRequest(bucketPrivate, path, file.getInputStream(), meta);putObjectRequest.setStorageClass(StorageClass.Standard);COSClient client = getCosPrivateClient();PutObjectResult putObjectResult = client.putObject(putObjectRequest); //上传文件HashMap map = new HashMap();map.put("path", path);client.shutdown();return map;}/*** 向私有存储桶上传文件(数据万象对上传图片审核)** @param file 前端上传的文件* @param path 文件上传的腾讯云存储路径(按照类型存储到不同的分类下的文件中下面)* @return* @throws IOException*/public HashMap uploadPrivateFileAndCloudInfinite(MultipartFile file, String path) throws IOException {String fileName = file.getOriginalFilename(); //上传文件的名字String fileType = fileName.substring(fileName.lastIndexOf(".")); //文件后缀名path += IdUtil.simpleUUID() + fileType; //避免重名图片在云端覆盖,所以用UUID作为文件名//元数据信息ObjectMetadata meta = new ObjectMetadata();meta.setContentLength(file.getSize());meta.setContentEncoding("UTF-8");meta.setContentType(file.getContentType());//向存储桶中保存文件PutObjectRequest putObjectRequest = new PutObjectRequest(bucketPrivate, path, file.getInputStream(), meta);putObjectRequest.setStorageClass(StorageClass.Standard);COSClient client = getCosPrivateClient();PutObjectResult putObjectResult = client.putObject(putObjectRequest); //上传文件HashMap map = new HashMap();map.put("path", path);//如果保存的是图片,用数据万象服务对图片内容审核if (List.of(".jpg", ".jpeg", ".png", ".gif", ".bmp").contains(fileType)) {//审核图片内容ImageAuditingRequest request = new ImageAuditingRequest();request.setBucketName(bucketPrivate);request.setDetectType("porn,terrorist,politics,ads"); //辨别黄色、暴利、政治和广告内容request.setObjectKey(path);ImageAuditingResponse response = client.imageAuditing(request); //执行审查if (!response.getPornInfo().getHitFlag().equals("0")|| !response.getTerroristInfo().getHitFlag().equals("0")|| !response.getPoliticsInfo().getHitFlag().equals("0")|| !response.getAdsInfo().getHitFlag().equals("0")) {//删除违规图片client.deleteObject(bucketPrivate, path);throw new EmosException("图片内容不合规");}}client.shutdown();return map;}/*** 获取私有读写文件的临时URL外网访问地址** @param path* @return*/public String getPrivateFileUrl(String path) {COSClient client = getCosPrivateClient();GeneratePresignedUrlRequest request =new GeneratePresignedUrlRequest(bucketPrivate, path, HttpMethodName.GET);Date expiration = DateUtil.offsetMinute(new Date(), 5); //设置临时URL有效期为5分钟request.setExpiration(expiration);URL url = client.generatePresignedUrl(request);client.shutdown();return url.toString();}/*** 刪除公有存储桶的文件* @param pathes*/public void deletePublicFile(String[] pathes) {COSClient client = getCosPublicClient();for (String path : pathes) {client.deleteObject(bucketPublic, path);}client.shutdown();}/*** 刪除私有存储桶的文件* @param pathes*/public void deletePrivateFile(String[] pathes) {COSClient client = getCosPrivateClient();for (String path : pathes) {client.deleteObject(bucketPrivate, path);}client.shutdown();}
}
3. 配置文件
tencent:cloud:appId: 腾讯云APPIDsecretId: 腾讯云SecretIdsecretKey: 腾讯云SecretKeyregion-public: 公有存储桶所在地域bucket-public: 公有存储桶名称region-private: 私有存储桶所在地域bucket-private: 私有存储桶名称