package com.ruoyi.service.impl;
|
|
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.*;
|
import com.qcloud.cos.region.Region;
|
import com.qcloud.cos.transfer.TransferManager;
|
import com.qcloud.cos.transfer.TransferManagerConfiguration;
|
import org.springframework.boot.context.properties.ConfigurationProperties;
|
import org.springframework.context.annotation.Bean;
|
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Service;
|
import org.springframework.web.multipart.MultipartFile;
|
|
import javax.annotation.PostConstruct;
|
import java.io.File;
|
import java.io.IOException;
|
import java.io.InputStream;
|
import java.util.UUID;
|
import java.util.concurrent.ExecutorService;
|
import java.util.concurrent.Executors;
|
|
@Service
|
@ConfigurationProperties(prefix = "tencent.cos")
|
public class GetOrPut {
|
// 从配置文件读取的参数
|
private String secretId;
|
private String secretKey;
|
private String bucketName;
|
private String region;
|
private String baseUrl;
|
|
private COSClient cosClient;
|
private TransferManager transferManager;
|
|
// 初始化配置
|
@PostConstruct
|
private void init() {
|
// 1. 初始化用户身份信息
|
COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);
|
|
// 2. 设置bucket的区域
|
Region region = new Region(this.region);
|
ClientConfig clientConfig = new ClientConfig(region);
|
clientConfig.setHttpProtocol(HttpProtocol.https);
|
|
// 3. 生成cos客户端
|
cosClient = new COSClient(cred, clientConfig);
|
|
// 4. 初始化传输管理器(用于大文件上传)
|
ExecutorService threadPool = Executors.newFixedThreadPool(32);
|
TransferManagerConfiguration transferConfig = new TransferManagerConfiguration();
|
transferConfig.setMultipartUploadThreshold(5 * 1024 * 1024);
|
transferManager = new TransferManager(cosClient, threadPool);
|
transferManager.setConfiguration(transferConfig);
|
}
|
|
/**
|
* 上传文件(MultipartFile方式)
|
* @param file 上传的文件
|
* @return 文件访问URL
|
*/
|
public String uploadFile(MultipartFile file) {
|
try {
|
// 生成唯一文件名
|
String originalFilename = file.getOriginalFilename();
|
String fileExt = originalFilename.substring(originalFilename.lastIndexOf("."));
|
String key = java.util.UUID.randomUUID().toString() + fileExt;
|
|
ObjectMetadata metadata = new ObjectMetadata();
|
metadata.setContentLength(file.getSize());
|
metadata.setContentType(file.getContentType());
|
|
PutObjectRequest putObjectRequest = new PutObjectRequest(
|
bucketName,
|
key,
|
file.getInputStream(),
|
metadata
|
);
|
|
// 上传文件
|
PutObjectResult putObjectResult = cosClient.putObject(putObjectRequest);
|
return baseUrl + "/" + key;
|
} catch (IOException e) {
|
throw new RuntimeException("文件上传失败", e);
|
}
|
}
|
|
/**
|
* 上传本地文件
|
* @param localFilePath 本地文件路径
|
* @return 文件访问URL
|
*/
|
public String uploadLocalFile(String localFilePath) {
|
File localFile = new File(localFilePath);
|
String key = UUID.randomUUID().toString() + getFileExtension(localFile.getName());
|
|
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, localFile);
|
cosClient.putObject(putObjectRequest);
|
return baseUrl + "/" + key;
|
}
|
|
/**
|
* 下载文件到本地
|
* @param key 文件唯一标识
|
* @param localFilePath 本地存储路径
|
*/
|
public void downloadFile(String key, String localFilePath) {
|
File downFile = new File(localFilePath);
|
GetObjectRequest getObjectRequest = new GetObjectRequest(bucketName, key);
|
cosClient.getObject(getObjectRequest, downFile);
|
}
|
|
/**
|
* 获取文件输入流
|
* @param key 文件唯一标识
|
* @return 文件输入流
|
*/
|
public InputStream getFileStream(String key) {
|
COSObject cosObject = cosClient.getObject(bucketName, key);
|
return cosObject.getObjectContent();
|
}
|
|
/**
|
* 删除文件
|
* @param key 文件唯一标识
|
*/
|
public void deleteFile(String key) {
|
cosClient.deleteObject(bucketName, key);
|
}
|
|
// 获取文件扩展名
|
private String getFileExtension(String fileName) {
|
return fileName.substring(fileName.lastIndexOf("."));
|
}
|
|
// Getter/Setter 用于配置注入
|
public void setSecretId(String secretId) { this.secretId = secretId; }
|
public void setSecretKey(String secretKey) { this.secretKey = secretKey; }
|
public void setBucketName(String bucketName) { this.bucketName = bucketName; }
|
public void setRegion(String region) { this.region = region; }
|
public void setBaseUrl(String baseUrl) { this.baseUrl = baseUrl; }
|
}
|