对象存储OSS如何通过PutObject上传文件?

  1. 云栖社区>
  2. 【阿里云】云大使推广计划>
  3. 博客>
  4. 正文

对象存储OSS如何通过PutObject上传文件?

云上珠玑 2019-08-17 10:51:44 浏览3266
展开阅读全文

迁移OSS的文件,就是将用户其他数据源的文件迁移至OSS。接下来几篇文章将介绍的方法是以下四种:一、通过API/SDK上传文件;二、通过API/SDK拷贝文件;三、通过oss-import工具迁移文件;四、通过云市场服务迁移文件。

通过API/SDK的方式上传文件以完成数据迁移的工作。众所周知,OSS所有的操作都是基于底层restfull的API接口来实现的,因此所有关于OSS的操作均可以通过API或者SDK来操作,数据迁移也不例外。通过API或者SDK中的PutObject、PostObject和MultipartUpload三个接口可以完成数据上传操作以进行数据迁移。这三种接口主要适用于不同的应用场景:PutObject主要适用于用户的服务器端向OSS发送文件,而该文件不宜太大的这种普适的适用场景;PostObject则适用于通过html表单直接post文件到OSS,不需要经过用户的应用服务器,这样减少用户应用服务器的负载情况;MultipartUpload支持断点上传,适用于网络质量较差或者文件大小较大的情况下的上传。通过上述的分析,可以知道本方法的优缺点,其中优点主要包括以下两点:一、适用场景广泛。用户只要可以获取到源数据,即可在任何地点通过该方式迁移数据至OSS,不需要限制用户源数据的来源、方式以及其文件格式等。二、使用灵活。用户可根据自己的需要自行编写迁移逻辑,选择是全量迁移、增量迁移或者舍去部分文件格式不进行迁移等,许多复杂的迁移逻辑都可以由用户通过代码来实现。对应其优点也就有两点主要的缺点:一、操作复杂。用户需要自行实现迁移逻辑,包括遍历源数据、调用上传接口等操作都需要用户通过代码来实现,需要用户有一定的代码基础。二、速度较慢。如果用户在调用API或者SDK的时候选择EndPoint为OSS的公网域名的情况下,该上传操作即需要通过公网来阐述。虽然OSS服务器端并未限制上传操作的带宽,但是该操作可能会受到源端公网带宽以及网络链路的影响而导致上传速度较慢。

接下来我们将以JavaSDK的方式向大家演示如何通过API/SDK的PutObject和MultipartUpload两个接口完成上传操作。

首先,登录阿里云的官网,找到帮助文档。

image

然后在帮助文档中我们找到OSS,点击SDK示例,点击Java→安装。

image

在安装页面中点击直接下载,下载完成后,我们将得到对应的SDK的压缩包。

image

对其进行解压,我们可以得到对应的文件夹,点击进入文件夹,我们可以得到整个SDK的文件目录,其中主要包含以下几个部分:

image

doc主要包含SDK的说明文档,包含其中的各个接口以及类的说明。

image

lib包含了SDK的依赖包,用户在加入SDK的时候需要将对应的lib文件夹下的所有jar包加入工程中才可以正常使用SDK。

image

Samples主要包含为用户提供的一些示例代码。根据其类别,我们对其进行了分类,然后用户可以根据各名称进行挑选。

image

sources主要包含了SDK的源代码,用户如果需要修改源代码的话,可以根据本源代码进行修改。

image

接下来我们将向大家介绍如何通过Java的SDK调用API的PutObject和MultipartUpload来完成数据的上传操作。

首先,我们找到本地的eclipse开发环境,将其打开。在菜单栏中新建Java Project,定义Project名称为OssTest_1,选择Next。

image

在Libraries里头添加额外的jar包(这里我们找到SDK中的lib文件夹,将lib文件夹中的所有jar包添加进来),点击Finish。这样,我们一个简单应用JavaSDK的项目就算建成了。我们可以在src里头添加对应的class来完成对应的操作。

image

这里我们直接应用SDK中提供的示例代码为大家进行讲解。

首先我们将向大家介绍如何通过PutObject上传文件,其中PutObject主要的逻辑代码如本代码所示。

image

其中重要的几个部分分别是ACCESS_ID、ACCESS_KEY,这两个分别对应用户帐号的AccessKeySecret和AccessKey。Endpoint指定的是对应的Bucket所属的域名。用户可以根据Bucket的地理数据中心来得到对应的Endpoint的值。

image

我们以杭州为例,Bucketname指定的是用户设置的Bucket的名称,用户可以选择自己在OSS控制台上创建的OSS Bucket的名称。Key指的是对应的上传的Object的Key值,这里Key包含了Object相对的目录以及它的文件名,用户可以在这个地方指定其相对目录。比方说aliyuntest/photo1.jpg文件。这里我们根据ID、Key还有Endpoint我们可以new一个OSSCllent对象得到对应的Cllent对象。

接下来我们调用Cllent对象的PutObject接口来实现上传操作。这里主要有两种方法:第一种是根据stream流来上传。这里我们首先去得到一个文件,然后将文件的内容捕获成stream流,再通过PutObject上传进入Cllent。这里需要注意的是,我们在通过流上传的时候需要指定它对应的ObjectMetadata,其中必须要指定的一个参数是ContentLength,该参数指定了文件的大小,而ContentType主要是指定了文件的类型。

image

第二种方法是直接通过文件的形式进行上传。如果是上传用户本地已有的文件,建议使用第二种方法。这样只需要new一个file对象即可通过PutObject完成上传。

使用PutObject有以下三点注意事项:

一、用户在metaData中指定了Content-MD5请求头的时候,OSS会在接收到完全的body以后计算body的Content-MD5并与用户指定的MD5请求头进行一致性校验。如果一致性校验通过,该文件及上传成功;如果校验失败,则会出现上传失败的操作。
二、如果在Head中用户没有加入Content length参数,则会返回411 Length Required错误。如果在Head中用户加入的Content length参数过小,则可能会导致文件只上传了前半部分的Content length长度,而后半部分的文件则直接丢弃。如果用户设置的Content length参数过大,可能会导致OSS一直等待客户端发起的包一直到Timeout,报超时错误。
三、如果用户在创建OSSCllent的时候指定的ID/KEY或者ENDPOINT有误的时候可能会报403 AccessDenide的问题。

更多信息参见:对象存储 OSS > SDK 示例 > Java > 简单上传


原文地址:https://aliyunnew.com/a/How-does-Object-Storage-OSS-upload-files-via-PutObjectMultipartUpload.html

网友评论

登录后评论
0/500
评论
云上珠玑
+ 关注