腾讯云对象存储COS
一 准备工作
1 注册腾讯云
首先注册与登录等腾讯云,官网地址:https://cloud.tencent.com/
2 开通腾讯云对象存储COS
腾讯云对象存储COS:官网地址:https://cloud.tencent.com/product/cos
3 进入控制台创建存储桶
填写信息
第二页直接默认就好
这里的请求域名等一下构建回显url要用,记下来
记下名称和域名
4 获得腾讯云访问密钥
准备工作完毕
二 集成项目
你可以新建springboot项目或者直接集成现有项目
1 在pom文件引入COS依赖
<dependency>
<groupId>com.qcloud</groupId>
<artifactId>cos_api</artifactId>
<version>5.6.227</version>
</dependency>
2 添加配置
根据刚刚自己创建的信息填
tencent:
cloud:
secretId: AKIDxjGYcR0KPFqBH8j6E7l9ICq****
secretKey: KPFsGPJyNWQ5WheNq55qMcdOuABw****
region: ap-guangzhou
bucketPrivate: text-private-1307503602
3 新建配置类
TencentCloudProperties
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Data
@Component
@ConfigurationProperties(prefix = "tencent.cloud")
public class TencentCloudProperties {
private String secretId;
private String secretKey;
private String region;
private String bucketPrivate;
}
4 Controller
import com.miniodemo.miniodemo.service.CosService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@RestController
@RequestMapping("cos")
public class CosController {
@Autowired
private CosService cosService;
@PostMapping("/upload")
public String upload(@RequestPart("file") MultipartFile file) {
return cosService.upload(file);
}
}
5 Service
CosService:
import org.springframework.web.multipart.MultipartFile;
public interface CosService {
String upload(MultipartFile file);
}
CosServiceImpl:
import com.miniodemo.miniodemo.config.TencentCloudProperties;
import com.miniodemo.miniodemo.service.CosService;
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.HttpProtocol;
import com.qcloud.cos.model.ObjectMetadata;
import com.qcloud.cos.model.PutObjectRequest;
import com.qcloud.cos.model.PutObjectResult;
import com.qcloud.cos.model.StorageClass;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Objects;
import java.util.UUID;
import static org.apache.logging.log4j.message.MapMessage.MapFormat.JSON;
// 使用Lombok的@Slf4j注解简化日志记录器的创建
@Slf4j
@Service
public class CosServiceImpl implements CosService {
// 自动注入TencentCloudProperties配置类,包含腾讯云COS服务所需的配置信息
@Autowired
private TencentCloudProperties tencentCloudProperties;
// 创建私有的COS客户端实例
private COSClient getPrivateCOSClient() {
// 使用SecretId和SecretKey初始化COS凭证对象
COSCredentials cred = new BasicCOSCredentials(tencentCloudProperties.getSecretId(), tencentCloudProperties.getSecretKey());
// 创建客户端配置,并设置区域信息
ClientConfig clientConfig = new ClientConfig(new Region(tencentCloudProperties.getRegion()));
// 设置HTTP协议为HTTPS
clientConfig.setHttpProtocol(HttpProtocol.https);
// 返回一个COS客户端实例
return new COSClient(cred, clientConfig);
}
// 生成UUID作为文件名的一部分,确保文件名唯一性
private String generateUUID() {
return UUID.randomUUID().toString().replaceAll("-", "").substring(0, 32);
}
@Override
public String upload(MultipartFile file) {
// 获取COS客户端实例
COSClient cosClient = this.getPrivateCOSClient();
try {
// 设置文件的元数据
ObjectMetadata meta = new ObjectMetadata();
meta.setContentLength(file.getSize()); // 设置文件大小
meta.setContentEncoding("UTF-8"); // 设置文件编码
meta.setContentType(file.getContentType()); // 设置文件类型
// 获取原始文件名
String originalFilename = file.getOriginalFilename();
// 获取当前日期时间
LocalDateTime time = LocalDateTime.now();
// 定义日期格式
DateTimeFormatter dft = DateTimeFormatter.ofPattern("yyyy/MM/dd");
// 拼接存储路径
String folder = dft.format(time); // 根据日期生成文件夹路径
String fileName = generateUUID(); // 生成随机文件名
// 获取文件扩展名
String extension = Objects.requireNonNull(originalFilename).substring(originalFilename.lastIndexOf("."));
// 拼接完整的文件路径
String uploadFileName = "user/" + folder + "/" + fileName + extension;
// 创建PutObjectRequest对象,准备上传文件
PutObjectRequest putObjectRequest = new PutObjectRequest(tencentCloudProperties.getBucketPrivate(), uploadFileName, file.getInputStream(), meta);
// 设置存储级别为标准存储
putObjectRequest.setStorageClass(StorageClass.Standard);
// 执行上传操作
PutObjectResult putObjectResult = cosClient.putObject(putObjectRequest);
// 如果上传成功,则返回文件的URL
if (putObjectResult != null) {
log.info("上传成功");
// 构建文件访问URL
return "https://" + tencentCloudProperties.getBucketPrivate() + ".cos." + tencentCloudProperties.getRegion() + ".myqcloud.com" + "/" + uploadFileName;
}
} catch (Exception e) {
// 记录错误日志
log.error("上传失败:", e);
// 打印异常堆栈信息
e.printStackTrace();
} finally {
// 关闭COS客户端以释放资源
cosClient.shutdown();
}
// 如果上传失败或发生异常,返回null
return null;
}
}
6 测试
用apifox测试
点击链接成功访问
7 私有读写
如果是私有读写,需要生成临时访问url才能图片回显
生成方法:
private String getImageUrl(String path) {
if(!StringUtils.hasText(path)) return "";
COSClient cosClient = getPrivateCOSClient();
GeneratePresignedUrlRequest request =
new GeneratePresignedUrlRequest(tencentCloudProperties.getBucketPrivate(), path, HttpMethodName.GET);
//设置临时URL有效期为15分钟
Date expiration = new DateTime().plusMinutes(15).toDate();
request.setExpiration(expiration);
URL url = cosClient.generatePresignedUrl(request);
cosClient.shutdown();
return url.toString();
}
然后刚刚的方法就要改成这样:
@Override
public String upload(MultipartFile file) {
COSClient cosClient = this.getPrivateCOSClient();
try {
ObjectMetadata meta = new ObjectMetadata();
meta.setContentLength(file.getSize());
meta.setContentEncoding("UTF-8");
meta.setContentType(file.getContentType());
String originalFilename = file.getOriginalFilename();
LocalDateTime time = LocalDateTime.now();
DateTimeFormatter dft = DateTimeFormatter.ofPattern("yyyy/MM/dd");
String folder = dft.format(time);
String fileName = generateUUID();
String extension = Objects.requireNonNull(originalFilename).substring(originalFilename.lastIndexOf("."));
String uploadFileName = "user/" + folder + "/" + fileName + extension;
PutObjectRequest putObjectRequest = new PutObjectRequest(tencentCloudProperties.getBucketPrivate(), uploadFileName, file.getInputStream(), meta);
putObjectRequest.setStorageClass(StorageClass.Standard);
PutObjectResult putObjectResult = cosClient.putObject(putObjectRequest);
if (putObjectResult != null) {
log.info("上传成功");
// 构建文件访问URL,改动这里
return getImageUrl(uploadFileName);
}
} catch (Exception e) {
log.error("上传失败:", e);
e.printStackTrace();
} finally {
cosClient.shutdown();
}
return null;
}
完成!