
大家好,我是小悟。
你的本地硬盘是不是又双叒叕在尖叫了?照片、文档、视频堆得像个数字垃圾场,每次扩容都像在给老房子打补丁,心惊胆战?别慌,是时候给你心爱的SpringBoot应用介绍一位“高富帅”朋友了——腾讯云对象存储COS!它可不是个普通的网盘,而是一个拥有“12个9”(99.9999999999%)数据持久性的“钢铁堡垒”。
COS就像一个拥有无限地下室的超级豪宅(存储桶),你的每个文件(对象)都是独立的房间,想放啥就放啥,没有格式限制,也无需操心怎么给“房间”分区。你只管往里面塞东西,从热门的APP图片视频,到冷门的年度归档日志,它都能用最经济的方式帮你打理得井井有条。
最棒的是,你再也不用当“硬件采购员”和“服务器保姆”了。COS按量付费,用多少算多少,还能通过生命周期管理自动把“冷数据”挪到“便宜阁楼”(低频或归档存储),帮你省下真金白银。而且,它还是社交达人,能轻松和CDN(内容分发网络)、数据万象(图片处理)等联动,给你的文件加上全球加速、智能美颜等Buff。
下面,给你的SpringBoot应用装上通往这座“云上别墅”的专属电梯。
myblog-1250000000)和所在地域(如ap-guangzhou)。权限设置上,强烈建议选择“私有读写”,安全第一。SecretId和SecretKey。请像保护银行卡密码一样保护它们!pom.xml里,加入腾讯云COS的官方SDK依赖。<dependency>
<groupId>com.qcloud</groupId>
<artifactId>cos_api</artifactId>
<version>5.6.227</version> <!-- 可使用当前最新稳定版 -->
</dependency>我们不能把密钥硬编码在代码里。最佳实践是使用配置类。
CosClientConfig) 这个类负责从配置文件(如application.yml)读取连接信息,并创建COS客户端Bean。package com.yourproject.config;
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.region.Region;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@ConfigurationProperties(prefix = "cos.client") // 从配置文件读取cos.client下的属性
@Data // Lombok注解,自动生成getter/setter
public class CosClientConfig {
// 对应配置文件里的 cos.client.host
private String host;
private String secretId;
private String secretKey;
private String region;
private String bucketName;
@Bean
public COSClient cosClient() {
// 1. 初始化身份信息(门卡和密码)
COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);
// 2. 设置存储桶的地域
ClientConfig clientConfig = new ClientConfig(new Region(region));
// 3. 生成COS客户端
return new COSClient(cred, clientConfig);
}
}application.yml) 在application.yml(或专用于本地开发的application-local.yml,记得加入.gitignore)中填写你的密钥信息。# 腾讯云COS配置
cos:
client:
host: https://your-bucket-name.cos.ap-guangzhou.myqcloud.com # 你的存储桶访问域名(非必须,可用于拼接URL)
secret-id: your-secret-id-here # 替换为你的SecretId
secret-key: your-secret-key-here # 替换为你的SecretKey
region: ap-guangzhou # 替换为你的存储桶地域,如ap-beijing
bucket-name: myblog-1250000000 # 替换为你的存储桶名称创建一个CosManager服务类,封装所有和COS交互的操作。
package com.yourproject.manager;
import com.qcloud.cos.COSClient;
import com.qcloud.cos.model.*;
import com.yourproject.config.CosClientConfig;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.io.File;
@Component
public class CosManager {
@Resource
private CosClientConfig cosClientConfig;
@Resource
private COSClient cosClient;
/**
* 上传文件到COS(简单上传,适用于小文件)
* @param key 对象键,即文件在COS中的完整路径,如 "images/avatar.jpg"
* @param file 本地文件
* @return 上传结果
*/
public PutObjectResult uploadFile(String key, File file) {
// 创建上传请求,参数:桶名,对象键,本地文件
PutObjectRequest putObjectRequest = new PutObjectRequest(cosClientConfig.getBucketName(), key, file);
// 执行上传
return cosClient.putObject(putObjectRequest);
}
/**
* 下载文件
* @param key 对象键
* @return COS对象,包含文件的输入流等信息
*/
public COSObject downloadFile(String key) {
GetObjectRequest getObjectRequest = new GetObjectRequest(cosClientConfig.getBucketName(), key);
return cosClient.getObject(getObjectRequest);
}
/**
* 删除文件
* @param key 对象键
*/
public void deleteFile(String key) {
cosClient.deleteObject(cosClientConfig.getBucketName(), key);
}
}最后,通过Controller提供HTTP接口。
package com.yourproject.controller;
import com.yourproject.manager.CosManager;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.UUID;
@RestController
@RequestMapping("/cos")
@Slf4j
public class CosController {
@Resource
private CosManager cosManager;
@PostMapping("/upload")
public String upload(@RequestPart("file") MultipartFile multipartFile) {
// 生成唯一文件名,防止覆盖
String originalFilename = multipartFile.getOriginalFilename();
String fileExtension = originalFilename.substring(originalFilename.lastIndexOf("."));
String key = "upload/" + UUID.randomUUID() + fileExtension; // 存储在upload目录下
File tempFile = null;
try {
// 创建临时文件
tempFile = File.createTempFile("cos-upload-", null);
multipartFile.transferTo(tempFile);
// 调用Manager上传
cosManager.uploadFile(key, tempFile);
// 返回文件的访问路径(如果是私有读,此处应返回一个预签名URL)
return String.format("文件上传成功!Key: %s", key);
} catch (IOException e) {
log.error("文件上传失败", e);
return "上传失败";
} finally {
// 清理临时文件
if (tempFile != null && tempFile.exists()) {
boolean deleted = tempFile.delete();
if (!deleted) {
log.warn("临时文件删除失败: {}", tempFile.getAbsolutePath());
}
}
}
}
@GetMapping("/download")
public void download(@RequestParam String key, HttpServletResponse response) throws IOException {
// 通过key获取COS中的文件对象
try (COSObject cosObject = cosManager.downloadFile(key)) {
if (cosObject == null) {
response.sendError(404, "文件不存在");
return;
}
// 设置响应头,告诉浏览器这是附件下载
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment; filename=\"" + key.substring(key.lastIndexOf("/") + 1) + "\"");
// 将COS文件流写入HTTP响应流
try (InputStream cosInput = cosObject.getObjectContent()) {
IOUtils.copy(cosInput, response.getOutputStream());
response.flushBuffer();
}
} catch (Exception e) {
log.error("文件下载失败, key: {}", key, e);
response.sendError(500, "下载失败");
}
}
}// 在CosManager中增加生成预签名URL的方法
public String generatePresignedUrl(String key, Date expirationTime) {
GeneratePresignedUrlRequest req = new GeneratePresignedUrlRequest(cosClientConfig.getBucketName(), key, HttpMethodName.GET);
req.setExpiration(expirationTime);
return cosClient.generatePresignedUrl(req).toString();
}好了,旅程到此结束!我们来回顾一下:
CosManager作为核心文件管家,封装上传、下载等脏活累活。CosController提供了清晰的REST API,让前端或其他服务能轻松调用。“代码写得好,不如云服务选得巧”。让应用具备拥抱海量数据的能力。如果遇到问题,别忘了多翻翻腾讯云官方文档,那里有最权威的答案。

谢谢你看我的文章,既然看到这里了,如果觉得不错,随手点个赞、转发、在看三连吧,感谢感谢。那我们,下次再见。
您的一键三连,是我更新的最大动力,谢谢
山水有相逢,来日皆可期,谢谢阅读,我们再会
我手中的金箍棒,上能通天,下能探海
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。