提交 ff7ad2c1 作者: 张小凤

Multipart upload(add)

上级 c40fbf42
package com.mmc.pms.controller; package com.mmc.pms.controller;
import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS; import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder; import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.*; import com.aliyun.oss.model.*;
import com.mmc.pms.common.ResultBody; import com.mmc.pms.common.ResultBody;
import com.mmc.pms.json.JsonUtil; import com.mmc.pms.json.JsonUtil;
...@@ -9,12 +11,15 @@ import com.mmc.pms.redis.RedisConstant; ...@@ -9,12 +11,15 @@ import com.mmc.pms.redis.RedisConstant;
import com.mmc.pms.util.OssConstant; import com.mmc.pms.util.OssConstant;
import com.mmc.pms.util.PartUploadInfo; import com.mmc.pms.util.PartUploadInfo;
import com.mmc.pms.util.TDateUtil; import com.mmc.pms.util.TDateUtil;
import com.mmc.pms.util.XmlUtil;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import springfox.documentation.annotations.ApiIgnore;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.io.File; import java.io.File;
...@@ -23,6 +28,7 @@ import java.io.IOException; ...@@ -23,6 +28,7 @@ import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.UUID;
/** /**
* @Author small @Date 2023/5/23 13:46 @Version 1.0 * @Author small @Date 2023/5/23 13:46 @Version 1.0
...@@ -30,10 +36,12 @@ import java.util.List; ...@@ -30,10 +36,12 @@ import java.util.List;
@Api(tags = {"分片上传"}) @Api(tags = {"分片上传"})
@RestController @RestController
@RequestMapping("/partupload") @RequestMapping("/partupload")
@Slf4j
public class PartUploadController { public class PartUploadController {
@Autowired private StringRedisTemplate stringRedisTemplate; @Autowired private StringRedisTemplate stringRedisTemplate;
@ApiIgnore
@ApiOperation(value = "初始化分片上传") @ApiOperation(value = "初始化分片上传")
@GetMapping("/initPartUpload") @GetMapping("/initPartUpload")
public ResultBody initPartUpload(@RequestParam String fileName, HttpServletRequest httpRequest) { public ResultBody initPartUpload(@RequestParam String fileName, HttpServletRequest httpRequest) {
...@@ -74,7 +82,7 @@ public class PartUploadController { ...@@ -74,7 +82,7 @@ public class PartUploadController {
.set(RedisConstant.createPartUploadKey(uploadId), JsonUtil.parseObjToJson(pinfo)); .set(RedisConstant.createPartUploadKey(uploadId), JsonUtil.parseObjToJson(pinfo));
return ResultBody.success(uploadId); return ResultBody.success(uploadId);
} }
@ApiIgnore
@ApiOperation(value = "进行片段上传") @ApiOperation(value = "进行片段上传")
@PostMapping("/partUpload") @PostMapping("/partUpload")
public ResultBody partUpload( public ResultBody partUpload(
...@@ -138,6 +146,7 @@ public class PartUploadController { ...@@ -138,6 +146,7 @@ public class PartUploadController {
return ResultBody.success(); return ResultBody.success();
} }
@ApiIgnore
@ApiOperation(value = "上传到阿里云oss") @ApiOperation(value = "上传到阿里云oss")
@PostMapping("/oss") @PostMapping("/oss")
public ResultBody oss( public ResultBody oss(
...@@ -221,4 +230,95 @@ public class PartUploadController { ...@@ -221,4 +230,95 @@ public class PartUploadController {
ossClient.shutdown(); ossClient.shutdown();
return ResultBody.success(); return ResultBody.success();
} }
@PostMapping("/multipartUpload")
public ResultBody multipartUpload(
@RequestParam("multipartUpload") MultipartFile uploadFile, HttpServletRequest request) throws IOException {
OSS ossClient =
new OSSClientBuilder()
.build(OssConstant.ENDPOINT, OssConstant.ACCESSKEYID, OssConstant.ACCESSKEYSECRET);
File file = XmlUtil.ossUpload(uploadFile);
String oldName = uploadFile.getOriginalFilename();
String newName =
"file/"
+ UUID.randomUUID().toString()
+ oldName.substring(oldName.lastIndexOf("."), oldName.length());
String location=null;
try {
// 创建InitiateMultipartUploadRequest对象。
InitiateMultipartUploadRequest requests= new InitiateMultipartUploadRequest(OssConstant.BUCKET, newName);
// 初始化分片。
InitiateMultipartUploadResult upresult = ossClient.initiateMultipartUpload(requests);
// 返回uploadId,它是分片上传事件的唯一标识。您可以根据该uploadId发起相关的操作,例如取消分片上传、查询分片上传等。
String uploadId = upresult.getUploadId();
List<PartETag> partETags = new ArrayList<PartETag>();
final long partSize = 1 * 1024 * 1024L; //1 MB。
// 根据上传的数据大小计算分片数。以本地文件为例,说明如何通过File.length()获取上传数据的大小。
final File sampleFile = new File(file.toString());
long fileLength = sampleFile.length();
int partCount = (int) (fileLength / partSize);
if (fileLength % partSize != 0) {
partCount++;
}
// 遍历分片上传。
for (int i = 0; i < partCount; i++) {
long startPos = i * partSize;
long curPartSize = (i + 1 == partCount) ? (fileLength - startPos) : partSize;
UploadPartRequest uploadPartRequest = new UploadPartRequest();
uploadPartRequest.setBucketName("pad-video-x");
uploadPartRequest.setKey(newName);
uploadPartRequest.setUploadId(uploadId);
// 设置上传的分片流。
// 以本地文件为例说明如何创建FIleInputstream,并通过InputStream.skip()方法跳过指定数据。
InputStream instream = new FileInputStream(sampleFile);
instream.skip(startPos);
uploadPartRequest.setInputStream(instream);
// 设置分片大小。除了最后一个分片没有大小限制,其他的分片最小为100 KB。
uploadPartRequest.setPartSize(curPartSize);
// 设置分片号。每一个上传的分片都有一个分片号,取值范围是1~10000,如果超出此范围,OSS将返回InvalidArgument错误码。
uploadPartRequest.setPartNumber( i + 1);
// 每个分片不需要按顺序上传,甚至可以在不同客户端上传,OSS会按照分片号排序组成完整的文件。
UploadPartResult uploadPartResult = ossClient.uploadPart(uploadPartRequest);
// 每次上传分片之后,OSS的返回结果包含PartETag。PartETag将被保存在partETags中。
partETags.add(uploadPartResult.getPartETag());
}
CompleteMultipartUploadRequest completeMultipartUploadRequest =
new CompleteMultipartUploadRequest(OssConstant.BUCKET, newName, uploadId, partETags);
// 完成分片上传。
CompleteMultipartUploadResult completeMultipartUploadResult = ossClient.completeMultipartUpload(completeMultipartUploadRequest);
log.info(completeMultipartUploadResult.getETag());
location = completeMultipartUploadResult.getLocation();
} catch (OSSException oe) {
log.info("Caught an OSSException, which means your request made it to OSS, "
+ "but was rejected with an error response for some reason.");
log.info("Error Message:" + oe.getErrorMessage());
log.info("Error Code:" + oe.getErrorCode());
log.info("Request ID:" + oe.getRequestId());
log.info("Host ID:" + oe.getHostId());
} catch (ClientException ce) {
log.info("Caught an ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ "such as not being able to access the network.");
log.info("Error Message:" + ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
deleteFile(file);
return ResultBody.success(location);
}
private void deleteFile(File... files) {
for (File file : files) {
if (file.exists()) {
file.delete();
}
}
}
} }
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论