整体分片上传接口
This commit is contained in:
parent
514add13d1
commit
a7ac8c8222
@ -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")
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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的返回结果包含PartETag。PartETag将被保存在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);
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -30,13 +30,5 @@ public class MultipartUploadFileDto {
|
||||
@NotBlank
|
||||
private String fileName;
|
||||
|
||||
@NotBlank
|
||||
private String tgtFileKey;
|
||||
|
||||
private MultipartFile file;
|
||||
|
||||
/**
|
||||
* oss上传时的上传id
|
||||
*/
|
||||
private String uploadId;
|
||||
}
|
||||
|
||||
@ -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);
|
||||
});
|
||||
|
||||
@ -44,5 +44,5 @@ public interface FileService {
|
||||
|
||||
FileInformationResponse multipartUploadComplete(MultipartUploadCompleteDto dto);
|
||||
|
||||
MultipartUploadFileResponse multipartUploadFile(MultipartUploadFileDto dto) throws IOException;
|
||||
FileInformationResponse multipartUploadFile(MultipartUploadFileDto dto);
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
Reference in New Issue
Block a user