阿里云OSS预签名文件分片上传

官方文档

上传流程
  1. 初始化获取文件唯一标识
  2. 获取分片上传URL
  3. 分片上传完成后根据文件唯一标识合并分片
代码
  • 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();
            }
        }
    
    }
    
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值