首先,需要在 application.properties 文件中配置 OSS 的相关信息,包括 endpoint、accessKeyId、accessKeySecret、bucketName 等。
oss.endpoint=your_endpoint
oss.accessKeyId=your_access_key_id
oss.accessKeySecret=your_access_key_secret
oss.bucketName=your_bucket_name
然后创建一个名为 OssService 的服务类,用于封装 OSS 的相关操作。
@Service
public class OssService {
@Value("${oss.endpoint}")
private String endpoint;
@Value("${oss.accessKeyId}")
private String accessKeyId;
@Value("${oss.accessKeySecret}")
private String accessKeySecret;
@Value("${oss.bucketName}")
private String bucketName;
private OSS ossClient;
/**
* 初始化 OSS 客户端
*/
@PostConstruct
private void initOssClient() {
ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
}
/**
* 分片上传文件到 OSS
* @param file 上传的文件
* @param folderPath 文件夹路径
* @throws Exception
*/
public void uploadFileByPart(File file, String folderPath) throws Exception {
String fileName = file.getName();
String suffix = fileName.substring(fileName.lastIndexOf(".") + 1);
String newFileName = UUID.randomUUID().toString() + "." + suffix;
String key = folderPath + newFileName;
// 初始化分片上传
InitiateMultipartUploadRequest initRequest = new InitiateMultipartUploadRequest(bucketName, key);
InitiateMultipartUploadResult initResult = ossClient.initiateMultipartUpload(initRequest);
String uploadId = initResult.getUploadId();
// 计算文件分片数
long partSize = 1024 * 1024 * 5; // 5MB
long fileLength = file.length();
int partCount = (int) (fileLength / partSize);
if (fileLength % partSize != 0) {
partCount++;
}
// 上传文件分片
List<PartETag> partETags = new ArrayList<>();
for (int i = 0; i < partCount; i++) {
long startPos = i * partSize;
long curPartSize = (i == partCount - 1) ? (fileLength - startPos) : partSize;
// 构造分片上传请求
UploadPartRequest uploadRequest = new UploadPartRequest();
uploadRequest.setBucketName(bucketName); // 设置bucket名称
uploadRequest.setKey(key); // 设置上传文件的key
uploadRequest.setUploadId(uploadId); // 设置上传的Upload ID
uploadRequest.setInputStream(new FileInputStream(file)); // 设置上传文件的输入流
uploadRequest.setPartSize(curPartSize); // 设置分片大小
uploadRequest.setPartNumber(i + 1); // 设置分片编号
// 执行分片上传并获取结果
UploadPartResult uploadResult = ossClient.uploadPart(uploadRequest);
// 将分片上传结果添加到partETags列表中
partETags.add(uploadResult.getPartETag());
// 完成分片上传
CompleteMultipartUploadRequest completeRequest = new CompleteMultipartUploadRequest(bucketName, key, uploadId, partETags);
ossClient.completeMultipartUpload(completeRequest);
}
/**
* 关闭 OSS 客户端
*/
@PreDestroy
private void closeOssClient() {
if (ossClient != null) {
ossClient.shutdown();
}
}
}