开发者社区> 云上珠玑> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

阿里云oss如何通过MultipartUpload向OSS上传大文件?

简介: 今天向大家介绍如何通过MultipartUpload向OSS上传大文件,这里我们采用的是SDK中包含的OSSMultipartSample.java这个文件中的示例代码进行操作。除了PutObject中的基本设置之外,MultipartUpload还需要一些额外的设置。
+关注继续查看

今天向大家介绍如何通过MultipartUpload向OSS上传大文件,这里我们采用的是SDK中包含的OSSMultipartSample.java这个文件中的示例代码进行操作。除了PutObject中的基本设置之外,MultipartUpload还需要一些额外的设置。例如这里设置的PART SIZE主要是来指定后续UPLOAD时候的每个分块的大小。

image

这里还指定了上传PART的并发线程数。接下来我们来查看主函数,同样我们在主函数中先new一个Client对象,该Client对象可以通过ClientConfiguration来进行设置,这里我们采用的是默认设置。

image

在new一个Client对象后,我们去生成一个File对象,该File对象指代的是我们的大文件,我们在这里采用upLoadBigfile来统一的编写MultipartUpload的代码,我们点击进入upLoadBigfile查看其详细实现细节。

image

在该过程中,我们做的第一个步骤是计算分块的个数。我们会根据前述所定义的每个Part的大小来计算总共的分块个数,如果计算得到的PartCount小于等于一,则说明本次计算有误,我们需要重新进行任务。在计算完成之后,将通过initMultipartUpload接口来对分块上传进行初始化操作。点击进入该函数。

image

我们可以看到,该函数的参数是通过Client、bucketName以及ObjectName三个参数来实现的,主要是为了初始化一个分块上传的事件。初始化完成后,我们将得到一个uploadID,该uploadID将全局指定标识本分块上传事件。

在初始化分块上传任务的时候,我们是调用Client的InitiateMultipartUpload接口来对分块上传进行初始化。用户可以指定InitUploadRequest来指定其Request相关参数。完成后我们可以得到对应的标识该MultipartUpload的uploadID。

image

接下来我们需要创建一个线程池,我们这里采用的是上述的两并发的线程池,该线程池主要应用的是UploadPartThread。点击进入该线程查看一下。

image

我们可以看到该线程主要是通过调用Client.uploadPart功能来实现上传分块的一个接口,它的实参主要是uploadPartRequest。uploadPartRequest可以指定本次upload分块的一些属性,主要包括:BucketName、ObjectName、uploadID,它对应的Stream流和他的PartSize以及它对应的PartNumber。我们会根据指定的Bucket名称、uploadID和PartNumber区分对应的分块。

上传完成后,OSS会返回其对应的Part数据的MD5值放在eTags中,而我们可以通过list容器来获取该eTags值。

完成第二步分块上传后,我们可以通过判断我们list容器的size大小是否与我们预期的partCount的大小一致。

image

如果一致,说明我们所有的分块都已经正常上传;如果不一致,则说明我们有分块未成功上传。

确认所有分块正常上传后,我们可以通过completMultipartUpload接口来对整个分块上传任务进行完成的操作。

在完成一个MultipartUpload的请求的时候,需要用户提供有效的各分块的列表,其中包括各分块的号码(也就是PartNumer)和他对应的eTags值。OSS在接收到用户提供的Part列表以后,会逐个验证各个分块的有效性,当所有的分块有效性都验证通过后,OSS会将这些Part数据组成一个完整的Object。这里就是调用通过Client的completMultipartUpload接口来实现的。

完成上述操作后,整个MultipartUpload就算是实现完成了。而对于MultipartUpload需要注意以下两点:一、在上传分块的时候,可以通过对每个分块设置Content-MD5来验证每个分块上传的时候的有效性;二、除了最后一个分块以外,所有的分块的大小都必须大于100KB。

更多信心参见:对象存储 OSS > Java > 分片上传


原文地址:https://aliyunnew.com/a/How-to-upload-large-files-to-OSS-via-MultipartUpload.html

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
oss 追加上传支持excel文件使用吗
oss 追加上传支持excel文件使用吗
0 0
oss区分存储怎么把图片压缩后再上传?
oss区分存储怎么把图片压缩后再上传?
0 0
iOS开发:日志记录文件及压缩上传OSS
发现APP上传本地日志文件相当的好用,根据之前研究学习的对这一模块做了一些更具体的优化处理。从标题可以看出,实现这一功能分以下几个步骤: 1、日志记录本地文件 2、日志文件压缩[xx.zip] 3、压缩之后的文件上传 4、压缩文件删除
0 0
OSS 上传出现异常
OSSBrower "no space left on" 分析: 有明显报错信息的先 Google 一下,看看是操作系统错误还是 OSSBrower 抛出,经过鉴定错误是 Linux 系统底层返回,说明当时系统的 OSSBrower 所在的目录磁盘满了,开源的错误到处可以看到,自行解决即可。
0 0
基于OSS作为存储实现加速访问和加速上传的方案的对比
本文通过实现OSS加速的两种方式CDN加速OSS和OSS传输加速来介绍OSS的加速的实现,两种加速方式的区别以及两种加速模式选择使用的场景;
0 0
JAVA实现RTMP推流上传阿里云OSS的签名URL
由于目前官方帮助文档提供的示例是Python的,本文介绍如何使用JAVA实现生成LiveChannel的签名URL,包括推流地址和播放地址。
0 0
【OSS最佳实践】JAVA实现RTMP推流上传OSS的签名URL
背景介绍 OSS支持使用RTMP协议推送H264编码的视频流和AAC编码的音频流到OSS。推送到OSS的音视频数据可以点播播放;在对延迟不敏感的应用场景,也可以做直播用途。RTMP推流上传的流程是创建LiveChannel以后生成推流地址,关于这块的介绍在官方帮助文档里也有介绍,具体可以参考文档"RTMP推流上传"。
1416 0
【OSS对象存储】上传OSS提示callbackfailed问题
针对上传文件到OSS对象存储成功后,OSS返回callbackfailed的场景
0 0
基于OSS作为存储实现加速访问和加速上传的方案实现
本文通过实现OSS加速的两种方式CDN加速OSS和OSS传输加速来介绍OSS的加速的配置实现方式
0 0
OSS传输加速商业化,加速云上数据上传、下载访问体验
OSS 传输加速功能迎来商业化,助力客户的业务覆盖更多地域,解决远距离传输性能问题。利用全球分布的云机房能力,OSS传输加速将来自全球各地的用户访问由DNS 路由至就近的OSS接入点,用户请求到达OSS就近节点后,会经过优化过的网络及协议访问Bucket所在的数据中心。
10487 0
+关注
云上珠玑
后端开发者,阿里云用户
文章
问答
文章排行榜
最热
最新
相关电子书
更多
百问百答-OSS (上)
立即下载
百问百答-OSS (下)
立即下载
阿里云 JindoFS+OSS 数据上云实战
立即下载