开发者学堂课程【管理功能玩转对象存储 OSS 使用入门:如何迁移 OSS 的文件_1】学习笔记,与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/378/detail/4744
如何迁移 OSS 的文件_1
内容介绍
一、通过 API/SDK 上传文件
二、Put0bject 注意事项
一、通过API/SDK上传文件
1、概述
Oss 所有的操作都是基于底层 resourceful 的 API 接口实现,因此所有关于 oss 的操作均可以通过 API 或者 SDK 进行操作,数据迁移一样不例外,用户可遍历所有需上传的文件,通过 API/SDK 中的 Put0bject、PostObject 和 MultipartUpload 三个接口完成上传操作。
2、区别
(1)Put0bject
可用于服务器端向 oss 上传不易太大的文件。
(2)PostObject
适合于通过html表单直接上传文件到 bucket, 不经过用户的应用服务器,这样减少用户应用服务器的负载情况。
(3)MultipartUpload
支持断点上传,适合于网络质量较差或者文件大小较大的情况下的上传。
3、优缺点
(1)优点:
① 适用场景广泛、用户只要可以获取到原数据,即可在任何地点通过该方式迁移数据 oss ,不需要限制用户原数据的来源方式,以及其文件格式等。
② 使用灵活,用户可根据自己的需要自行编写迁移逻辑。用户可以自行选择是全量迁移或者增量迁移,或者舍去部分文件格式不进行迁移等复杂的迁移轨迹,都由用户通过代码来实现。
(2)缺点:
① 操作复杂,用户需要自行实现迁移逻辑,包括便利源数据调用上传接口等操作,都需要用户通过代码来实现,需要用户有一定的代码基础。
② 速度较慢,如果用户在调用 API 或者 SDK 的时候选择 n.point为 oss 的公网域名的情况下,该上传操作即需要通过公网来传输,虽然 oss 服务器端并未限制上传操作的带宽,但是该操作可能会受到源端公网带宽以及网络链路的影响,而导致上传速度较慢。
4、操作
通过 java sdk 的 Put0bject 和 MultipartUpload 的两个接口完成上传操作。
(1)登陆阿里云的官网,在帮助与文档中寻找 oss ,点击 sdk 手册,点击 sdk 开发包下载,点击 java sdk 开发包,点击下载最新的 java sdk, 下载完成后将得到对应的 sdk 压缩包对其进行解压,可以得到相应的文件夹,点击进入文件夹,可以得到整个 sdk 的文件目录,其中包含 demo ,主要是对 sdk 使用的实例,用户可以根据 read me.txt 里的帮助文档来直接调用对应的 java 包进行应用 sdk。Doc 主要包含 sdk 的说明文档,包含其中的各个接口以及类的说明,lib 包含了 fdk 的依赖包,用户在加入 sdk 的时候,需要将对应的 lib 文件夹下的所有 java 包加入工程中才可以正常使用 sdk,samples 为用户提供的一些示例代码,根据其类别对其进行了分类,然后用户可以根据各名称进行挑选。Sources 主要包含了 SDK 的源代码,用户如果需要修改源代码,可以根据本源代码进行修改。read me.txt 包含了本 SDK 的一个说明文档。
(2)接下来通过 java sdk 调用 API 的 Putobject 和 MultipartUpload 完成上传操作。首先找到本地 eclipse 开发环境,将其打开。菜单栏中新建 Java project ,这里定义 project 的名称为 OSStest_1 ,选择 next 。在 library 里添加额外的炸包。这时候找到 SDK 中的内部文件夹,将内部文件夹中的所有 java 包,找到 sdk 中的 lib 文件夹,把 lib 文件夹中的所有文件添加进来,点击 finish,这样 JavaSDK 的项目就建成了,可以在 sources 里面添加对应的 class 来完成对应的操作,这里直接应用 SDK 中提供的示例代码进行讲解。
(3)首先通过 Putobject 上传文件,这里对 oss object sample.Java 里面的内容进行了更改,其中 Putobject 中主要的逻辑代码如以下代码:
private static final String ACCESS_ID = "<your
a
ccess k
e
y id>";
private static final String ACCESS_KEY= "<your access key secret>";
private static final String Endpoint="http//ass-cn-hangzhou.allyuncs.com";
publie static void maia(String[] args) throws Exception (
String
b
ucketname = bucketname" ,
string key ="photo1-Jpg" ;
String filenme= "di/temp/photo. jpg" ;
其中重要的几个部分,分别注意是 ACCESS_KEY、 ACCESS_ID ,这两个分别对应于用户账号的 ACCESS_KEY 和 ACCESS_secret 。Endpoint 指定的是对应的 bucket 所属的域名,用户可以根据 bucket 的地理数据中心来得到对应的 Endpoint 的值。这里以杭州为例, bucketname 指定的是用户设置的 bucket 的名称,用户可以选择自己在 os s的控制台上创建的 oss bucket 的名称,Key 指的是它对应上传的 object,它的 K 值。这里的 k 包含了 object它的相对目录以及它的文件名,用户可以在这个地方指定其相对目录,比如 aliyuntest 目录下的 picture1.pig 文件,根据 id,key 和Endpointpoint,可以用一个 ossclient 的对象得到对应的 client对象。
(4)调用 client 对象的 putobject 的接口来实现上传操作,这里主要有两种方法,第一种就是根据 stream lie 来上传的,首先去得到一个文件,然后将文件的内容过程捕获成 stream lie ,再通过putobject 上传进入 client 。这里需要注意的是在通过 lie 形式上传的时候需要指定它对应的 objectmatadata, 其中必须要指定的有一个参数是 contentlength 该参数指定的文件的大小,而 contentType 主要是指定了文件的类型。第二种方法就是直接通过文件的形式进行上传,该方法如果是用户本地已有的文件建议使用第二种方法,这里只需要new 一个 file 对象即可通过 putobject 完成上传。
二、Put0bject注意事项
1、用户在 metaData 中指定 Content -MD5 请求头,OSS 会在接收到完全的 body 之后,会计算 body 的 Content -MD5 并与用户指定 MD5 请求头检查一致性,如果一致性校验通过,则该文件上传成功,如果校验失败则会出现上传失败的操作。
2、如果 Head 中没有加入 Content length 参数, 会返回 411 Length Required 错误。如果在 Head 中加入参数过小,可能会导致文件只上传了前半部分的 Content length 长度的文件,而后半部分的文件则直接进行丢弃。如果用户设置的 Content length 参数过大,可能会导致 oss 一直等待客户端发起的包,一直到 time out报超时错误。
3、ID/KEY/ENDPOINT 设置有误会报403, 错误码: AccessDenied。如果用户在创建 oss client 时候指定的 id、key 或 ENDPOINT 有误的时候,可能会报 403AccessDenied 的问题。