思路
前提条件:不管使用哪家云计算厂商的对象存储,您都至少需要已获取对象存储的:(1).accessKey。(2).secretKey。(3).serviceEndpoint。(4).已经创建了桶。
步骤:
- 初始化分片上传事件;
- 进行文件分片上传;
- 完成分片上传;
实现分析:第一步初始化,需要根据前提条件先获取对象存储客户端。使用客户端开启分片上传事件后,会返回一个uploadId,进行分片上传时需要。第二步,分片上传,实际项目中一般是前端分好片,然后直接调用后端的分片接口,在这里我是将本地文件分片上传,不涉及前端。第三步,根据桶名和uploadId,完成上传(会把各分片合成一个对象)。
所需方法准备
1.获取对象存储客户端方法
/**
* 创建AmazonS3对象并返回(外部需要AmazonS3对象来操作时)
*
* @return AmazonS3对象
* @author
*/
public AmazonS3 amazonS3() {
AWSCredentials awsCredentials = new BasicAWSCredentials(accessKey, secretKey);
AmazonS3ClientBuilder amazonS3ClientBuilder = AmazonS3ClientBuilder.standard()
.withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(endPoint, "beijing"))
.withCredentials(new AWSStaticCredentialsProvider(awsCredentials));
return amazonS3ClientBuilder.build();
}
2.开启分片上传事件方法
/**
* 开启分片上传事件
* @param uploadParam uuid 和 fileName 生成对象key用
* @return 返回uploadId和对象key(操作对象时唯一标识)
*/
public Map<String,String> startMultiPartUpload(Map<String,String> uploadParam) {
//初始化分片上传事件
AmazonS3 amazonS3 = getAmazonS3();
Map<String,String> uploadInfo = new HashMap<>();
//存储对象的独一无二key:uuid + filename
String objectKey = uploadParam.get("uuid") + "_" + uploadParam.get("fileName");
uploadInfo.put("objectKey",objectKey);
InitiateMultipartUploadRequest initiateMultipartUploadRequest = new InitiateMultipartUploadRequest(BUCKET_NAME, objectKey);
InitiateMultipartUploadResult initiatedResult = amazonS3.initiateMultipartUpload(initiateMultipartUploadRequest);
uploadInfo.put("uploadId",initiatedResult.getUploadId());
return uploadInfo;
}
3.开启分片上传方法
/**
* 分片上传时调用
* @param chunkParam 分片上传时所需参数
* @param file 分片的文件
*/
@Override
public void multiPartUpload(FileChunk chunkParam, MultipartFile file) {
AmazonS3 amazonS3 = getAmazonS3();
UploadPartRequest uploadPartRequest =