1、导入相关依赖
首先导入Cos云存储的相关依赖。
<!--腾讯云COS-->
<dependency>
<groupId>com.tencentcloudapi</groupId>
<artifactId>tencentcloud-sdk-java</artifactId>
<version>3.0.1</version>
</dependency>
<dependency>
<groupId>com.qcloud</groupId>
<artifactId>cos_api</artifactId>
<version>5.6.8</version>
</dependency>
2、编写配置类
首先需要获取相关配置参数,进入腾讯云对象存储,创建存储桶并进入所创建的存储桶。
public class CosConfig {
//腾讯云账号秘钥
private String secretId = "";
//密码秘钥
private String secretKey = "";
//存储桶地区
private String region="";
//存储桶名称
private String bucketName="";
//存储桶访问路径
private String path="";
//初始化cos对象,配置相关配置信息
@Bean
public COSClient cosClient(){
// 1 初始化用户身份信息(secretId, secretKey)。
COSCredentials cred = new BasicCOSCredentials(this.secretId, this.secretKey);
// 2 设置 bucket 的区域
Region region = new Region(this.region);
ClientConfig clientConfig = new ClientConfig(region);
// 3 生成 cos 客户端。
COSClient cosClient = new COSClient(cred, clientConfig);
return cosClient;
}
}
3、编写逻辑层
其实最好的方式是将Cos云配置信息放入application.properties或application.yml文件中,但我在之前配置的时候因为一些原因没这么配置,只好就这样写了,有兴趣的话可以自己配置到配置文件中,引用会更加方便。 详细信息直接看代码。
//在此编写你要实现的功能方法
public interface ICosFileService {
//文件批量上传
public ReturnUtil upload(MultipartFile[] files);
//文件删除
void delete(String fileName);
}
@Service
public class CosFileServiceImpl implements ICosFileService {
private String secretId = "";
private String secretKey = "";
private String region = "";
private String bucketName = "";
private String path = "";
@Autowired
private COSClient cosClient;
@Override
@Transactional(rollbackFor = Exception.class)
public ReturnUtil upload(MultipartFile[] files) {
ReturnUtil responseDto = null;
String res = "";
try {
for (MultipartFile file : files) {
String originalfileName = file.getOriginalFilename();
// 获得文件流
InputStream inputStream = file.getInputStream();
//设置文件key
String filePath = getFileKey(originalfileName);
// 上传文件
cosClient.putObject(new PutObjectRequest(bucketName, filePath, inputStream, null));
cosClient.setBucketAcl(bucketName, CannedAccessControlList.PublicRead);
String url = path + "/" + filePath;
res += url + ",";
}
String paths = res.substring(0, res.length() - 1);
return new ReturnUtil(200, "成功并返回数据", paths);
} catch (Exception e) {
e.printStackTrace();
} finally {
cosClient.shutdown();
}
return responseDto;
}
/**
* 生成文件路径
*
* @return
*/
private String getFileKey(String originalfileName) {
//获取后缀名
String fileType = originalfileName.substring(originalfileName.lastIndexOf("."));
//以文件后缀来在存储桶中生成文件夹方便文件管理
String filePath = fileType.substring(1, fileType.length()) + "/";
//去除文件后缀 替换所有特殊字符
String fileStr = StrUtil.removeSuffix(originalfileName, fileType).replaceAll("[^0-9a-zA-Z\\u4e00-\\u9fa5]", "_");
filePath += new DateTime().toString("yyyyMMddHHmmss") + "_" + fileStr + fileType;
return filePath;
}
@Override
public void delete(String fileName) {
CosConfig cosConfig = new CosConfig();
cosConfig.cosClient();
cosClient.deleteObject(this.bucketName, fileName);
}
}
4、测试
编写Controller层代码测试方法。
@Autowired
private ICosFileService iCosFileService;
@PostMapping("/test")
public ReturnUtil test(@RequestParam("files") MultipartFile[] files){
return iCosFileService.upload(files);
}
因为实现的是文件批量上传,当然单文件上传也没有问题,使用PostMan测试参数填写如上。
测试结果,因为我在多文件上传的时候将文件的访问路径以逗号隔开,有需要的话可以自己更改。
最后,delete方法就直接将上面文件生成的路径传进去就可以达到删除的效果了,我就不测试了。