上传流程
- 初始化获取文件唯一标识
- 获取分片上传URL
- 分片上传完成后根据文件唯一标识合并分片
代码
-
properties
oss.region=your_region oss.endpoint=your_endpoint oss.bucketName=your_bucketName oss.accessKeyId=your_accessKeyId oss.accessKeySecret=your_accessKeySecret
-
entity
@Data @Configuration @ConfigurationProperties(prefix = "oss") public class OssConfig { private String region; private String endpoint; private String bucketName; private String accessKeyId; private String accessKeySecret; }
@Data public class OssEntity { /** * 合并分片时需返回的数据 * eTag: 单个分片上传成功后返回的xml信息里面<eTag></eTag>的值 * partETags 数据格式: "partEtags":[{"partNumber":1,"eTag":"Etag1"},{"partNumber":2,"eTag":"Etag2"}] */ private List<Map<String, Object>> partETags; /** * 文件唯一标识 */ private String uploadId; /** * 文件名 */ private String objectName; /** * 第几片 从1开始 */ private String partNumber; /** * 文件类型 */ private String contentType; }
-
controller
@RestController @RequestMapping("/oss") public class OssController { @Resource private OssConfig ossConfig; private final OSS ossClient; public OssController(OssConfig ossConfig) { this.ossConfig = ossConfig; this.ossClient = new OSSClientBuilder() .build(ossConfig.getEndpoint(), ossConfig.getAccessKeyId(), ossConfig.getAccessKeySecret()); } /** * 分片上传初始化 */ @RequestMapping("init") public ResData<Map<String, String>> init() { String objectName = UUID.randomUUID().toString(); InitiateMultipartUploadRequest initRequest = new InitiateMultipartUploadRequest(ossConfig.getBucketName(), objectName); InitiateMultipartUploadResult result = ossClient.initiateMultipartUpload(initRequest); HashMap<String, String> hashMap = new HashMap<>(); // 文件唯一标识 hashMap.put("uploadId", result.getUploadId()); // 文件名 hashMap.put("objectName", objectName); return ResData.success(hashMap); } /** * 生成分片上传链接 */ @RequestMapping("url") public ResData<Map<String, Object>> url(@RequestBody OssEntity objData) { DefaultCredentialProvider credentialsProvider = new DefaultCredentialProvider(ossConfig.getAccessKeyId(), ossConfig.getAccessKeySecret()); // 签名版本 默认V1 ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration(); OSS ossClient = OSSClientBuilder .create() .region(ossConfig.getRegion()) .endpoint(ossConfig.getEndpoint()) .credentialsProvider(credentialsProvider) .clientConfiguration(clientBuilderConfiguration) .build(); // 设置请求头参数 Map<String, String> headers = new HashMap<>(); if (StringUtils.isNotBlank(objData.getContentType())) { headers.put(OSSHeaders.CONTENT_TYPE, objData.getContentType()); } else { headers.put(OSSHeaders.CONTENT_TYPE, "application/octet-stream"); } // 过期时间 24 小时后过期 Date expiration = new Date(new Date().getTime() + 1000L * 60 * 60 * 24); GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(ossConfig.getBucketName(), objData.getObjectName(), HttpMethod.PUT); request.setHeaders(headers); request.setExpiration(expiration); request.addQueryParameter("partNumber", objData.getPartNumber()); request.addQueryParameter("uploadId", objData.getUploadId()); // 生成预签名 URL URL signedUrl = ossClient.generatePresignedUrl(request); Map<String, Object> data = new HashMap<>(); data.put("url", signedUrl.toString()); data.put("headers", headers); return ResData.success(data); } /** * 合并分片 */ @RequestMapping("merge") public ResData<String> merge(@RequestBody OssEntity objData) { try { CompleteMultipartUploadRequest completeRequest = new CompleteMultipartUploadRequest(ossConfig.getBucketName(), objData.getObjectName(), objData.getUploadId(), partETags); CompleteMultipartUploadResult result = ossClient.completeMultipartUpload(completeRequest); return ResData.success("upload successful."); } catch (Exception e) { e.printStackTrace(); return ResData.error("fail to upload."); } } @PreDestroy public void shutdown() { if (ossClient != null) { ossClient.shutdown(); } } }