文件分片上传优化调整

This commit is contained in:
tianliyong 2023-08-24 09:56:48 +08:00
parent 83900d8835
commit 435b87a54b
8 changed files with 23 additions and 10 deletions

View File

@ -140,6 +140,7 @@ public class WebFileController {
.fileName(fileName) .fileName(fileName)
.tgtFileKey(tgtFileKey) .tgtFileKey(tgtFileKey)
.fileContent(file.getInputStream()) .fileContent(file.getInputStream())
.file(file)
.uploadId(uploadId) .uploadId(uploadId)
.build(); .build();
MultipartUploadFileResponse response = fileService.multipartUploadFile(dto); MultipartUploadFileResponse response = fileService.multipartUploadFile(dto);

View File

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

View File

@ -196,7 +196,7 @@ public class AliOssServiceImpl implements AliOssService {
} }
@Override @Override
public List<PartETag> multipartUploadFile(String bucketName, String tgtFileKey, String uploadId, InputStream inputStream) { public List<PartETag> multipartUploadFile(String bucketName, String tgtFileKey, String uploadId, MultipartFile file) {
OSS client = aliOssClient.getClient(); OSS client = aliOssClient.getClient();
try { try {
List<PartETag> partETags = new ArrayList<PartETag>(); List<PartETag> partETags = new ArrayList<PartETag>();
@ -204,7 +204,7 @@ public class AliOssServiceImpl implements AliOssService {
final long partSize = 10 * 1024 * 1024L; //1 MB final long partSize = 10 * 1024 * 1024L; //1 MB
// 根据上传的数据大小计算分片数以本地文件为例说明如何通过File.length()获取上传数据的大小 // 根据上传的数据大小计算分片数以本地文件为例说明如何通过File.length()获取上传数据的大小
long fileLength = inputStream.available(); long fileLength = file.getSize();
int partCount = (int) (fileLength / partSize); int partCount = (int) (fileLength / partSize);
if (fileLength % partSize != 0) { if (fileLength % partSize != 0) {
partCount++; partCount++;
@ -223,6 +223,9 @@ public class AliOssServiceImpl implements AliOssService {
// 分片文件 // 分片文件
//InputStream inputStream = new ByteArrayInputStream(fileContent); //InputStream inputStream = new ByteArrayInputStream(fileContent);
//inputStream.skip(startPos); //inputStream.skip(startPos);
// 跳过已经上传的分片
InputStream inputStream = file.getInputStream();
inputStream.skip(startPos);
partRequest.setInputStream(inputStream); partRequest.setInputStream(inputStream);
// 分片大小除了最后一个分片没有大小限制其他的分片最小为100 KB // 分片大小除了最后一个分片没有大小限制其他的分片最小为100 KB
partRequest.setPartSize(curPartSize); partRequest.setPartSize(curPartSize);

View File

@ -22,6 +22,10 @@
<groupId>cn.axzo.oss</groupId> <groupId>cn.axzo.oss</groupId>
<artifactId>oss-dal</artifactId> <artifactId>oss-dal</artifactId>
</dependency> </dependency>
</dependencies> <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</dependency>
</dependencies>
</project> </project>

View File

@ -3,6 +3,7 @@ package cn.axzo.oss.manager.api;
import cn.axzo.oss.manager.api.dto.PartETag; import cn.axzo.oss.manager.api.dto.PartETag;
import cn.axzo.oss.manager.api.dto.request.MultipartUploadDto; import cn.axzo.oss.manager.api.dto.request.MultipartUploadDto;
import cn.axzo.oss.manager.api.dto.request.MultipartUploadFileDto; import cn.axzo.oss.manager.api.dto.request.MultipartUploadFileDto;
import org.springframework.web.multipart.MultipartFile;
import java.io.InputStream; import java.io.InputStream;
import java.util.List; import java.util.List;
@ -48,5 +49,5 @@ public interface FileManager {
String multipartUploadComplete(String bucketName, String tgtFileKey, String uploadId, List<PartETag> partETags); String multipartUploadComplete(String bucketName, String tgtFileKey, String uploadId, List<PartETag> partETags);
List<PartETag> multipartUploadFile(String bucketName, String tgtFileKey, InputStream inputStream, MultipartUploadFileDto dto); List<PartETag> multipartUploadFile(String bucketName, String tgtFileKey, MultipartFile file, MultipartUploadFileDto dto);
} }

View File

@ -4,6 +4,7 @@ import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import org.springframework.web.multipart.MultipartFile;
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotBlank;
import java.io.File; import java.io.File;
@ -34,6 +35,8 @@ public class MultipartUploadFileDto {
private InputStream fileContent; private InputStream fileContent;
private MultipartFile file;
/** /**
* oss上传时的上传id * oss上传时的上传id
*/ */

View File

@ -10,6 +10,7 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.InputStream; import java.io.InputStream;
@ -72,8 +73,8 @@ public class FileManagerImpl implements FileManager {
} }
@Override @Override
public List<PartETag> multipartUploadFile(String bucketName, String tgtFileKey, InputStream inputStream, MultipartUploadFileDto dto) { 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(), dto.getFileContent()); List<com.aliyun.oss.model.PartETag> partETags = aliOssService.multipartUploadFile(bucketName, tgtFileKey, dto.getUploadId(), file);
return BeanConvertUtil.copyList(partETags, PartETag.class); return BeanConvertUtil.copyList(partETags, PartETag.class);
} }

View File

@ -182,13 +182,13 @@ public class FileServiceImpl implements FileService {
} }
@Override @Override
public MultipartUploadFileResponse multipartUploadFile(MultipartUploadFileDto dto) throws IOException { public MultipartUploadFileResponse multipartUploadFile(MultipartUploadFileDto dto) {
FileUploadConfig fileUploadConfig = getFileUploadConfig(dto.getAppCode(), dto.getBizScene()); FileUploadConfig fileUploadConfig = getFileUploadConfig(dto.getAppCode(), dto.getBizScene());
// 判断容量 // 判断容量
isFileConform(fileUploadConfig, dto.getFileContent().available(), dto.getFileName()); isFileConform(fileUploadConfig, (int)dto.getFile().getSize(), dto.getFileName());
List<PartETag> partETags = fileManager.multipartUploadFile(fileUploadConfig.getBucketName(), List<PartETag> partETags = fileManager.multipartUploadFile(fileUploadConfig.getBucketName(),
dto.getTgtFileKey(), dto.getFileContent(), dto); dto.getTgtFileKey(), dto.getFile(), dto);
MultipartUploadFileResponse response = MultipartUploadFileResponse.builder() MultipartUploadFileResponse response = MultipartUploadFileResponse.builder()
.uploadId(dto.getUploadId()) .uploadId(dto.getUploadId())
.partETags(partETags) .partETags(partETags)