整体分片上传接口

This commit is contained in:
tianliyong 2023-08-24 13:41:12 +08:00
parent 514add13d1
commit a7ac8c8222
8 changed files with 48 additions and 36 deletions

View File

@ -128,22 +128,18 @@ public class WebFileController {
@SneakyThrows
@PostMapping(value = "/v1/multipart-upload/file", consumes = MULTIPART_FORM_DATA_VALUE)
@CrossOrigin
public CommonResponse<MultipartUploadFileVo> multipartUploadFile(@Valid @RequestParam("appCode") String appCode,
public CommonResponse<FileInformationVo> multipartUploadFile(@Valid @RequestParam("appCode") String appCode,
@Valid @RequestParam("bizScene") String bizScene,
@Valid @RequestParam("fileName") String fileName,
@Valid @RequestParam("tgtFileKey") String tgtFileKey,
@Valid @RequestParam("uploadId") String uploadId,
@Valid @RequestPart MultipartFile file) {
MultipartUploadFileDto dto = MultipartUploadFileDto.builder()
.appCode(appCode)
.bizScene(bizScene)
.fileName(fileName)
.tgtFileKey(tgtFileKey)
.file(file)
.uploadId(uploadId)
.build();
MultipartUploadFileResponse response = fileService.multipartUploadFile(dto);
return CommonResponse.success(BeanConvertUtil.copyBean(response, MultipartUploadFileVo.class));
FileInformationResponse response = fileService.multipartUploadFile(dto);
return CommonResponse.success(BeanConvertUtil.copyBean(response, FileInformationVo.class));
}
@PostMapping("/v1/multipart-upload/complete")

View File

@ -63,5 +63,5 @@ public interface BaseS3Service {
String multipartUploadComplete(String bucketName, String tgtFileKey, String uploadId, List<PartETag> partETags);
List<PartETag> multipartUploadFile(String bucketName, String tgtFileKey, String uploadId, MultipartFile file);
String multipartUploadFile(String bucketName, String tgtFileKey, MultipartFile file);
}

View File

@ -196,9 +196,15 @@ public class AliOssServiceImpl implements AliOssService {
}
@Override
public List<PartETag> multipartUploadFile(String bucketName, String tgtFileKey, String uploadId, MultipartFile file) {
public String multipartUploadFile(String bucketName, String tgtFileKey, MultipartFile file) {
OSS client = aliOssClient.getClient();
try {
// 创建分片上传对象
InitiateMultipartUploadRequest uploadRequest = new InitiateMultipartUploadRequest(bucketName, tgtFileKey);
// 初始化分片
InitiateMultipartUploadResult result = client.initiateMultipartUpload(uploadRequest);
// 返回uploadId它是分片上传事件的唯一标识您可以根据这个uploadId发起相关的操作如取消分片上传查询分片上传等
String uploadId = result.getUploadId();
List<PartETag> partETags = new ArrayList<PartETag>();
// 每个分片的大小用于计算文件有多少个分片单位为字节
final long partSize = 10 * 1024 * 1024L; //1 MB
@ -234,8 +240,10 @@ public class AliOssServiceImpl implements AliOssService {
// 每次上传分片之后OSS的返回结果包含PartETagPartETag将被保存在partETags中
partETags.add(uploadPartResult.getPartETag());
}
return partETags;
CompleteMultipartUploadRequest completeMultipartUploadRequest =
new CompleteMultipartUploadRequest(bucketName, tgtFileKey, uploadId, partETags);
client.completeMultipartUpload(completeMultipartUploadRequest);
return getUrl(bucketName, tgtFileKey);
} catch (Exception e) {
e.printStackTrace();
throw new BizException(MULTIPART_UPLOAD_ERROR);

View File

@ -49,5 +49,5 @@ public interface FileManager {
String multipartUploadComplete(String bucketName, String tgtFileKey, String uploadId, List<PartETag> partETags);
List<PartETag> multipartUploadFile(String bucketName, String tgtFileKey, MultipartFile file, MultipartUploadFileDto dto);
String multipartUploadFile(String bucketName, String tgtFileKey, MultipartFile file, MultipartUploadFileDto dto);
}

View File

@ -30,13 +30,5 @@ public class MultipartUploadFileDto {
@NotBlank
private String fileName;
@NotBlank
private String tgtFileKey;
private MultipartFile file;
/**
* oss上传时的上传id
*/
private String uploadId;
}

View File

@ -73,9 +73,8 @@ public class FileManagerImpl implements FileManager {
}
@Override
public List<PartETag> multipartUploadFile(String bucketName, String tgtFileKey, MultipartFile file, MultipartUploadFileDto dto) {
List<com.aliyun.oss.model.PartETag> partETags = aliOssService.multipartUploadFile(bucketName, tgtFileKey, dto.getUploadId(), file);
return BeanConvertUtil.copyList(partETags, PartETag.class);
public String multipartUploadFile(String bucketName, String tgtFileKey, MultipartFile file, MultipartUploadFileDto dto) {
return aliOssService.multipartUploadFile(bucketName, tgtFileKey, dto.getFile());
}
@Override
@ -88,7 +87,7 @@ public class FileManagerImpl implements FileManager {
List<com.aliyun.oss.model.PartETag> partETagList = new ArrayList<>();
if (CollectionUtils.isNotEmpty(partETags)) {
partETags.stream().forEach(partETag -> {
com.aliyun.oss.model.PartETag ossPartETag = new com.aliyun.oss.model.PartETag(partETag.getPartNumber(), partETag.getETag(),
com.aliyun.oss.model.PartETag ossPartETag = new com.aliyun.oss.model.PartETag(partETag.getPartNumber(), partETag.getEtag(),
partETag.getPartSize(), partETag.getPartCRC());
partETagList.add(ossPartETag);
});

View File

@ -44,5 +44,5 @@ public interface FileService {
FileInformationResponse multipartUploadComplete(MultipartUploadCompleteDto dto);
MultipartUploadFileResponse multipartUploadFile(MultipartUploadFileDto dto) throws IOException;
FileInformationResponse multipartUploadFile(MultipartUploadFileDto dto);
}

View File

@ -182,18 +182,35 @@ public class FileServiceImpl implements FileService {
}
@Override
public MultipartUploadFileResponse multipartUploadFile(MultipartUploadFileDto dto) {
FileUploadConfig fileUploadConfig = getFileUploadConfig(dto.getAppCode(), dto.getBizScene());
// 判断容量
isFileConform(fileUploadConfig, (int)dto.getFile().getSize() / 10 , dto.getFileName());
public FileInformationResponse multipartUploadFile(MultipartUploadFileDto dto) {
File ossFile = multipartUploadAndGetFile(dto);
return setFileInfoResp(ossFile);
}
List<PartETag> partETags = fileManager.multipartUploadFile(fileUploadConfig.getBucketName(),
dto.getTgtFileKey(), dto.getFile(), dto);
MultipartUploadFileResponse response = MultipartUploadFileResponse.builder()
.uploadId(dto.getUploadId())
.partETags(partETags)
.build();
return response;
private File multipartUploadAndGetFile(MultipartUploadFileDto dto) {
FileUploadConfig fileUploadConfig = getFileUploadConfig(dto.getAppCode(), dto.getBizScene());
// 判断容量
String fileConform = isFileConform(fileUploadConfig, (int) dto.getFile().getSize() / 10, dto.getFileName());
String uuid = Utility.getUUID();
// 生成上传文件的唯一key
String tgtFileKey = Utility.generateFileKey(fileUploadConfig.getDirectory(), uuid, fileConform);
String fileUrl = fileManager.multipartUploadFile(fileUploadConfig.getBucketName(),
tgtFileKey, dto.getFile(), dto);
// 保存失败
if (Utility.isBlank(fileUrl)) {
log.error("fileUrl is empty");
throw new BizException(CodeEnum.MULTIPART_UPLOAD_ERROR);
}
try {
return getOssFile(fileUploadConfig, dto.getFileName(), fileConform, uuid, fileUrl,
Utility.getMd5(dto.getFile().getBytes()));
} catch (IOException e) {
log.error("file byte[] exception");
throw new BizException(CodeEnum.MULTIPART_UPLOAD_ERROR);
}
}
@Override