Java使用Amazon S3客户端实现前后端联动文件分片上传

在使用对象存储的时候,遇到超大文件上传的应用场景,可以通过前后端联动的方式,实现超大文件从前端直接向对象存储服务进行分片上传,具体实现过程如下:
Maven依赖:

<dependency><groupId>software.amazon.awssdk</groupId><artifactId>s3</artifactId><version>2.23.3</version><scope>test</scope>
</dependency>
  1. 由后端生成超大文件分片后的多个预签上传链接给前端
@Test
@DisplayName("测试生成分片上传预签地址")
public void testMultipartUpload() {String bucket = "bucketName";String object = "objectName";CreateMultipartUploadRequest multipartUploadRequest = CreateMultipartUploadRequest.builder().bucket(bucket).key(object).build();CreateMultipartUploadResponse multipartUploadResponse = s3Client.createMultipartUpload(multipartUploadRequest);String uploadId = multipartUploadResponse.uploadId();System.out.println("UploadId: " + uploadId);generateUploadPresignedUrls(presigner, bucket, object, uploadId, 2).stream().forEach(System.out::println);
}private List<String> generateUploadPresignedUrls(S3Presigner presigner, String bucketName, String keyName, String uploadId, int partCount) {List<String> presignedUrls = new ArrayList<>();for (int partNumber = 0; partNumber < partCount; partNumber++) {UploadPartRequest uploadPartRequest = UploadPartRequest.builder().bucket(bucketName).key(keyName).uploadId(uploadId).partNumber(partNumber).build();UploadPartPresignRequest uploadPartPresignRequest = UploadPartPresignRequest.builder().signatureDuration(Duration.ofMinutes(10)).uploadPartRequest(uploadPartRequest).build();PresignedUploadPartRequest presignedUploadPartRequest = presigner.presignUploadPart(uploadPartPresignRequest);URL url = presignedUploadPartRequest.url();presignedUrls.add(url.toString());}return presignedUrls;
}

得到UploadId和预签上传链接如下:

UploadId: ef32490d4801d55
https://xxx.xxxcloud.com.cn/oss/test1/2e48eb6f502xxxxxxxx7aae0fa0e69?partNumber=0&uploadId=ef32490d4801d55&X-Amz-Security-Token=&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20250307T064845Z&X-Amz-SignedHeaders=host&X-Amz-Credential=GMKFIWVHTQXGHXVFRSCY%2F20250307%2Flaz01%2Fs3%2Faws4_request&X-Amz-Expires=600&X-Amz-Signature=387c4f5d0a3c73b8333d1e872359798d9cbd4f3aa563fe9d6ced31dd9d4b1e2e
https://xxx.xxxcloud.com.cn/oss/test1/2e48eb6f502cxxxxxxa27aae0fa0e69?partNumber=1&uploadId=ef32490d4801d55&X-Amz-Security-Token=&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20250307T064845Z&X-Amz-SignedHeaders=host&X-Amz-Credential=GMKFIWVHTQXGHXVFRSCY%2F20250307%2Flaz01%2Fs3%2Faws4_request&X-Amz-Expires=600&X-Amz-Signature=95a232824ff032a4845b2311832746e11dd6a4b20a3eafe364fe3b985b5ffa66
  1. 预签上传链接返回给前端,对文件进行分片上传
// 前端通过PUT请求调用预签上传链接,上传文件流
...省略前端代码...

分片上传成功后对象存储服务会在响应请求头中返回ETag值,需要把ETag值保存下来传给后端作为完成分片上传请求的参数,如下:
image
3. 前端上传完所有分片后通过后端调用完成分片上传接口

@Test
@DisplayName("测试合并文件")
public void testMergeObjects() {List<CompletedPart> completedParts = new ArrayList<>();completedParts.add(CompletedPart.builder().partNumber(0).eTag("b6076b40b4538a0b6005cf1cdd8e80ce").build());completedParts.add(CompletedPart.builder().partNumber(1).eTag("0c17c47cf572116b95a481bed625cb0f").build());CompletedMultipartUpload completedMultipartUpload = CompletedMultipartUpload.builder().parts(completedParts).build();CompleteMultipartUploadRequest request = CompleteMultipartUploadRequest.builder().bucket("bucketName").key("objectName").uploadId("uploadId").multipartUpload(completedMultipartUpload).build();s3Client.completeMultipartUpload(request);}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/895094.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IOMMU和IOVA

IOMMU和IOVA 默认情况下,任何硬件都可以访问整个系统,因此它可以在任何地方执行DMA 事务。这有许多安全隐患。例如,流氓和/或不可信进程(包括在VM (虚拟机)内运行的进程)可能使用硬件设备来读写内核空间,和几乎其他任何存储位置。为了解决这个问题,现代系统配备了输入输出…

linux无法连接宿主机网络问题

很奇怪,之前我是可以连接宿主机互联网的,突然有一天不行了, 没找到具体的原因, 网上找了一下怎么解决,网络就又好了, 先记录一下,有时间在研究。 1、在虚拟机中创建的“电脑”上,右键选则setting(设置)。 2、选择NAT模式,然后点击Edit--》virtual network editor,点…

Node.js 路由

我们要为路由提供请求的 URL 和其他需要的 GET 及 POST 参数,随后路由需要根据这些数据来执行相应的代码。 因此,我们需要查看 HTTP 请求,从中提取出请求的 URL 以及 GET/POST 参数。这一功能应当属于路由还是服务器(甚至作为一个模块自身的功能)? 我们需要的所有数据都会…

SageMath 9.3软件下载与安装教程

1、安装包 扫描下方二维码关注「软知社」,后台回复【051】三位数字即可免费获取分享链接,无广告拒绝套路; 2、安装教程(建议关闭杀毒软件)双击解压安装包安装,弹窗安装对话框点击下一步选择I accept,点击下一步默认,点击下一步默认文件夹,点击下一步安装路径选择D盘,点…

GoLand 2024软件下载与安装教程

1、安装包 扫描下方二维码关注「软知社」,后台回复【048】三位数字即可免费获取分享链接,无广告拒绝套路; 2、安装教程(建议关闭杀毒软件)下载并解压压缩包,双击exe文件安装,弹窗安装对话框点击下一步创建桌面快捷方式,点击下一步默认,点击安装等待安装过程运行软件,点…

VisualStudio快速更改方法签名

右键——快速操作和重构 更改方法签名 更改签名中,即可进行添加或删除 *****有道无术,术尚可求;有术无道,止于术。*****

eclipse xml Indent using spaces not work /eclipse xml 使用空格缩进功能未生效问题解决

eclipse xml Indent using spaces not work eclipse xml 使用空格缩进功能未生效问题解决 设置xml格式化配置Line width: 设置每行宽度Line width设定为80到100个字符。 Split multiple attributes each on a new line: 标签的每个属性都单独一行显示 Preserve whitespace in t…

【多线程】AQS详解

AQS是什么 AbstractQueuedSynchronizer是一个抽象的队列同步器,AQS利用模板方法模式解决了开发者在实现同步器时的复杂问题,提供了一个通用的加锁解锁框架。 AQS执行原理 AQS为实现的同步器提供了通用的执行框架,定义了对资源state的获取和释放流程。AQS核心思想是在CLH锁的…

.NET 8 AOT

AOT是个防止反编译的好办法 都来看看怎么用吧~ 1.需要安装C++的桌面开发2.新建项目,选择控制台3.确认 <PublishAot>true</PublishAot> 是否为true4.发布release版本优点: 1. AOT 会生成一个自包含的应用程序,并且已提前 (AOT) 编译为本机代码。原生 AOT 应…

京准电钟:GPS北斗时间服务器的作用与应用

京准电钟:GPS北斗时间服务器的作用与应用京准电钟:GPS北斗时间服务器的作用与应用 京准电钟:GPS北斗时间服务器的作用与应用 京准电钟官微——ahjzsz GPS北斗时间服务器是一种利用全球卫星导航系统(GPS为美国系统,北斗为中国系统)提供高精度时间同步服务的设备,其核心作…

制造未来:大型车厂焊接站从PROFIBUS跃迁至PROFINET引爆智能革命

某大型生产现场焊接站的协议改造PROFIBUS从转PROFINET从网关一、背景介绍 某大型汽车制造厂拥有多个生产线,用于车身焊接、喷涂及装配等工序。其中,一条关键的焊接生产线长期采用PROFIBUS协议进行数据传输和设备控制。随着生产自动化程度的提升和工业4.0战略的推进,厂方决定…

信创数据库在金融行业的五大应用场景

信创产业作为国家信息技术创新发展的重要支撑,近年来取得了显著进展。其中,信创数据库在金融行业的应用日益广泛,为金融机构的数字化转型和安全稳定运行提供了有力保障。信创数据库凭借其自主可控、安全可靠等优势,在金融行业多个关键领域发挥着重要作用,不仅提升了金融机…