controller
private static final String PATH="fileUpload/";
@PostMapping("/initSharding")
public AjaxResult testInitControl(@RequestBody ShardingInfoDo param) {
ShardingInfoDo result = new ShardingInfoDo();
String taskId = UUID.randomUUID().toString().replaceAll("-", "");
String taskKey = PATH + taskId + param.getFileName();
result.setTaskId(taskId);
result.setFileName(param.getFileName());
String ossSlicesId = ossUtils.getUploadId(taskKey);
result.setOssSlicesId(ossSlicesId);
result.setMinSliceSize("100k");
redisService.setCacheObject(ossSlicesId, result);
return AjaxResult.success(result);
}
@PostMapping("/uploadShardingFile")
public AjaxResult testControl(ShardingInfoDo param, MultipartFile file) throws Exception {
ShardingInfoDo redisParam = redisService.getCacheObject(param.getOssSlicesId());
if (redisParam != null)
{
param.setPartETags(redisParam.getPartETags());
}
param.setSliceNo(param.getSliceNo()+1);
int sliceNo = param.getSliceNo();
int fileSlicesNum = param.getFileSlicesNum();
String ossSlicesId = param.getOssSlicesId();
InputStream inputStream = file.getInputStream();
Map<Integer, PartETag> partETags = param.getPartETags();
try
{
PartETag partETag = ossUtils.partUploadFile(PATH + param.getTaskId() + param.getFileName(), inputStream, ossSlicesId, param.getFileMD5(), param.getSliceNo(), file.getSize());
partETags.put(param.getSliceNo(), partETag);
if (fileSlicesNum == sliceNo)
{
String url = ossUtils.completePartUploadFile(PATH + param.getTaskId() + param.getFileName(), ossSlicesId, new ArrayList<>(partETags.values()));
param.setFileUrl(url);
redisService.deleteObject(ossSlicesId);
return AjaxResult.success(param);
} else
{
redisService.setCacheObject(param.getOssSlicesId(), param);
}
} catch (Exception e)
{
e.printStackTrace();
throw new Exception("上传异常");
}
return AjaxResult.success();
}
工具类
package com.ruoyi.common.utils;
import com.aliyun.oss.*;
import com.aliyun.oss.model.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.io.InputStream;
import java.util.List;
@Component
public class OssUtils {
private static Logger logger = LoggerFactory.getLogger(OssUtils.class);
@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;
@PostConstruct
public void init() {
ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
}
public String completePartUploadFile(String fileKey, String uploadId, List<PartETag> partETags) {
CompleteMultipartUploadRequest request = new CompleteMultipartUploadRequest(bucketName, fileKey, uploadId, partETags);
CompleteMultipartUploadResult completeMultipartUploadResult = ossClient.completeMultipartUpload(request);
String downLoadUrl = getDownloadUrl(fileKey, bucketName);
return downLoadUrl;
}
public PartETag partUploadFile(String fileKey, InputStream is, String uploadId, String fileMd5, int partNum, long partSize) {
UploadPartRequest uploadPartRequest = new UploadPartRequest();
uploadPartRequest.setBucketName(bucketName);
uploadPartRequest.setUploadId(uploadId);
uploadPartRequest.setPartNumber(partNum);
uploadPartRequest.setPartSize(partSize);
uploadPartRequest.setInputStream(is);
uploadPartRequest.setKey(fileKey);
uploadPartRequest.setMd5Digest(fileMd5);
UploadPartResult uploadPartResult = ossClient.uploadPart(uploadPartRequest);
return uploadPartResult.getPartETag();
}
public String getUploadId(String fileKey) {
InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest(bucketName, fileKey);
InitiateMultipartUploadResult unrest = ossClient.initiateMultipartUpload(request);
String uploadId = unrest.getUploadId();
return uploadId;
}
public String getDownloadUrl(String pathFile, String bucketName) {
StringBuffer url = new StringBuffer();
url.append(endpoint).append("/");
if (pathFile != null && !"".equals(pathFile))
{
url.append(pathFile);
}
return url.toString().replace("https://", "https://" + bucketName + ".");
}
}