更新时间:2024-06-18 GMT+08:00

文件上传(Java SDK)

功能说明

您可以将本地文件直接通过Internet上传至OBS指定的桶中。待上传的文件可以是任何类型。

开发过程中,您有任何问题可以在github上提交issue

接口约束

  • 您必须是桶拥有者或拥有上传对象的权限,才能上传对象。建议使用IAM或桶策略进行授权,如果使用IAM则需授予obs:object:PutObject权限,如果使用桶策略则需授予PutObject权限。相关授权方式介绍可参见OBS权限控制概述,配置方式详见使用IAM自定义策略配置对象策略
  • OBS支持的region以及region与endPoint的对应关系,详细信息请参见地区与终端节点
  • 单次上传对象大小范围是[0, 5GB]。
  • 如果需要上传超过5GB的大文件,需要通过分段上传来分段上传。

方法定义

obsClient.putObject(PutObjectRequest request)

请求参数说明

表1 请求参数列表

参数名

参数类型

是否必选

描述

request

PutObjectRequest

必选

参数解释

上传对象请求参数,详见PutObjectRequest

表2 PutObjectRequest

参数名称

参数类型

是否必选

描述

bucketName

String

必选

参数解释

桶名。

约束限制:

  • 桶的名字需全局唯一,不能与已有的任何桶名称重复,包括其他用户创建的桶。
  • 桶命名规则如下:
    • 3~63个字符,数字或字母开头,支持小写字母、数字、“-”、“.”。
    • 禁止使用IP地址。
    • 禁止以“-”或“.”开头及结尾。
    • 禁止两个“.”相邻(如:“my..bucket”)。
    • 禁止“.”和“-”相邻(如:“my-.bucket”和“my.-bucket”)。
  • 同一用户在同一个区域多次创建同名桶不会报错,创建的桶属性以第一次请求为准。

默认取值:

objectKey

String

必选

参数解释:

对象名。对象名是对象在存储桶中的唯一标识。对象名是对象在桶中的完整路径,路径中不包含桶名。

例如,您对象的访问地址为examplebucket.obs.ap-southeast-1.myhuaweicloud.com/folder/test.txt 中,对象名为folder/test.txt。

取值范围:

长度大于0且不超过1024的字符串。

默认取值:

metadata

ObjectMetadata

可选

参数解释:

对象元数据,详见ObjectMetadata

默认取值:

acl

AccessControlList

可选

参数解释:

创建对象时可指定的预定义访问策略,您可选择的访问策略选项参见AccessControlList,有关访问控制列表(Access Control List,ACL)功能的详细信息可参见ACL功能介绍

取值范围:

默认取值:

sseKmsHeader

SseKmsHeader

可选

参数解释:

服务端加密头信息。详见SseKmsHeader

默认取值:

sseCHeader

SseCHeader

可选

参数解释:

服务端加密头信息。详见SseCHeader

默认取值:

input

java.io.InputStream

可选

参数解释:

待上传对象的数据流。

默认取值:

file

java.io.File

可选

参数解释:

待上传对象的文件。

默认取值:

extensionPermissionMap

Map<ExtensionObjectPermissionEnum, Set<String>>

可选

参数解释:

桶ACL的授权Map,您可以为一个或多个账号授予桶权限。Map的ExtensionObjectPermissionEnum用于指定权限,Map的Set<String>用于说明该权限授予的账号ID列表,即domain_id列表。

取值范围:

默认取值:

expires

int

可选

参数解释:

表示对象的过期时间(从对象最后修改时间开始计算)。过期之后对象会被自动删除。

约束限制:

此字段对于每个对象支持上传时配置,也支持后期通过修改元数据接口附带头域x-obs-expires修改。

取值范围:

大于0的整型数,单位:天。

默认取值:

progressListener

ProgressListener

可选

参数解释:

上传进度,详见ProgressListener

encodeHeaders

boolean

可选

参数解释:

是否开启OBS对请求头域的自动编码。

由于HTTP编码规范限制,无法发送非ASCII码字符,SDK会在发送请求时对您头域中的中文汉字进行url编码,发送编码后数据。如您设置的值content-disposition为“attachment; filename="中文.txt"”,则对象元数据中存储的信息为“attachment; filename="%E4%B8%AD%E6%96%87.txt"”。使用浏览器访问时浏览器将会自动解码。

取值范围:

true:启用SDK编码。

false:不启用SDK编码。

默认取值:

true

表3 ProgressListener(传输进度接口)成员如下

方法名称

返回值类型

是否必选

描述

progressChanged

void

必选

参数解释:

获取上传进度,详见progressChanged

默认取值:

表4 progressChanged参数列表

参数名称

参数类型

是否必选

描述

status

ProgressStatus

必选

参数解释:

传输进度数据,详见ProgressStatus

默认取值:

表5 ProgressStatus方法

方法名称

返回值类型

说明

getAverageSpeed()

double

上传平均速率。

getInstantaneousSpeed()

double

上传瞬时速率。

getTransferPercentage()

int

上传进度百分比。

getNewlyTransferredBytes()

long

新增的字节数。

getTransferredBytes()

long

已传输的字节数。

getTotalBytes()

long

待传输的字节数。

表6 ExtensionObjectPermissionEnum

常量值

说明

GRANT_READ

授权指定租户有读对象和获取对象元数据的权限。

GRANT_READ_ACP

授权指定租户有获取对象ACL的权限。

GRANT_WRITE_ACP

授权指定租户有写对象ACL的权限。

GRANT_FULL_CONTROL

授权指定租户有读对象、获取对象元数据、获取对象ACL、写对象ACL的权限。

表7 SseKmsHeader

参数名称

参数类型

是否必选

描述

encryption

ServerEncryption

必选

参数解释:

以SSE-KMS方式加密对象。

参数解释:

表示服务端加密是SSE-KMS方式。对象使用SSE-KMS方式加密。

取值范围:

可选值:kms,即选择SSE-KMS方式加密对象,详见ServerEncryption

默认取值:

sseAlgorithm

SSEAlgorithmEnum

可选

参数解释:

加密算法。

约束限制:

只支持kms。

取值范围:

详见SSEAlgorithmEnum

默认取值:

kmsKeyId

String

可选

参数解释:

SSE-KMS加密方式下使用的KMS主密钥的ID值。

取值范围:

有效值支持两种格式:

  1. regionID:domainID(账号ID):key/key_id
  2. key_id

其中:

默认取值:

  • 如果用户没有提供该头域,那么默认的主密钥将会被使用。
  • 如果默认主密钥不存在,将默认创建并使用。
表8 SseCHeader

参数名称

参数类型

是否必选

描述

algorithm

ServerAlgorithm

必选

参数解释:

表示服务端加密是SSE-C方式,对象使用SSE-C加密方式。

取值范围:

可选值:AES256,即选择SSE-C方式,使用高级加密标准(Advanced Encryption Standard,AES)加密对象。详见ServerAlgorithm

默认取值:

sseAlgorithm

SSEAlgorithmEnum

可选

参数解释:

加密算法。

约束限制:

只支持AES256。

取值范围:

详见SSEAlgorithmEnum

默认取值:

sseCKey

byte[]

必选

参数解释:

SSE-C方式下加密使用的原始密钥,byte[]形式,该密钥用于加密对象。

默认取值:

sseCKeyBase64

String

可选

参数解释:

SSE-C方式下的密钥,由原始密钥经过Base64编码后得到,该密钥用于加密对象。

默认取值:

表9 ServerEncryption

常量值

原始值

OBS_KMS

kms

表10 SSEAlgorithmEnum

常量值

原始值

KMS

kms

AES256

AES256

表11 ServerAlgorithm

常量值

原始值

AES256

AES256

表12 AccessControlList

参数名称

参数类型

是否必选

参数类型

owner

Owner

可选

参数解释

桶所有者的信息,详见Owner

delivered

boolean

可选

参数解释:

桶的ACL是否向桶内对象传递,作用于桶内所有对象。

取值范围:

true:是,桶ACL向桶内对象传递。

false:否,桶ACL不向桶内对象传递,仅作用于桶。

默认取值:

false

grants

Set<GrantAndPermission>

可选

参数解释:

被授权用户相关信息,详见GrantAndPermission

表13 Owner

参数名称

参数类型

是否必选

描述

id

String

必选

参数解释

桶所有者的账号ID,即domain_id。

取值范围:

如何获取账号ID请参见如何获取账号ID和用户ID?

默认取值:

displayName

String

可选

参数解释:

所有者的账号名。

取值范围:

如何获取账号名请参见如何获取账号名?

默认取值:

表14 GrantAndPermission

参数名称

参数类型

是否必选

描述

grantee

GranteeInterface

必选

参数解释:

被授权用户或用户组,详见GranteeInterface

permission

Permission

必选

参数解释:

用户或用户组被授予的权限。

取值范围:

详见Permission

默认取值:

delivered

boolean

可选

参数解释:

桶的ACL是否向桶内对象传递,作用于桶内所有对象。

取值范围:

true:是,桶ACL向桶内对象传递。

false:否,桶ACL不向桶内对象传递,仅作用于桶。

默认取值:

false

表15 Permission

常量名

原始值

说明

PERMISSION_READ

READ

读权限。

如果有桶的读权限,则可以获取该桶内对象列表、桶内多段任务、桶的元数据、桶的多版本。

如果有对象的读权限,则可以获取该对象内容和元数据。

PERMISSION_WRITE

WRITE

写权限。

如果有桶的写权限,则可以上传、覆盖和删除该桶内任何对象和段。

此权限在对象上不适用。

PERMISSION_READ_ACP

READ_ACP

读取ACL配置的权限。

如果有读ACP的权限,则可以获取对应的桶或对象的权限控制列表(ACL)。

桶或对象的所有者永远拥有读对应桶或对象ACP的权限。

PERMISSION_WRITE_ACP

WRITE_ACP

修改ACL配置的权限。

如果有写ACP的权限,则可以更新对应桶或对象的权限控制列表(ACL)。

桶或对象的所有者永远拥有写对应桶或对象的ACP的权限。

拥有了写ACP的权限,由于可以更改权限控制策略,实际上意味着拥有了完全访问的权限。

PERMISSION_FULL_CONTROL

FULL_CONTROL

完全控制权限,包括对桶或对象的读写权限,以及对桶或对象ACL配置的读写权限。

如果有桶的完全控制权限意味着拥有READ、WRITE、READ_ACP和WRITE_ACP的权限。

如果有对象的完全控制权限意味着拥有READ、READ_ACP和WRITE_ACP的权限。

表16 GranteeInterface

参数名称

参数类型

是否必选

描述

CanonicalGrantee

CanonicalGrantee

必选

参数解释:

被授权用户的用户信息,详见CanonicalGrantee

GroupGrantee

GroupGrantee

必选

参数解释:

被授权用户组的用户组信息。

取值范围:

详见GroupGrantee

默认取值:

表17 CanonicalGrantee

参数名称

参数类型

是否必选

描述

grantId

String

如果Type为用户类型则必选

参数解释:

被授权用户的账号ID,即domain_id。

取值范围:

如何获取账号ID请参见如何获取账号ID和用户ID?

默认取值:

displayName

String

可选

参数描述:

被授权用户的账号名。

取值范围:

如何获取账号名请参见如何获取账号名?

默认取值:

表18 GroupGrantee

常量名

说明

ALL_USERS

所有用户。

AUTHENTICATED_USERS

授权用户,已废弃。

LOG_DELIVERY

日志投递组,已废弃。

表19 ObjectMetadata

参数名称

参数类型

是否必选

描述

contentLength

Long

可选

参数解释:

对象数据的长度。

约束限制:

  • 单次上传对象大小范围是[0, 5GB]。
  • 如果需要上传超过5GB的大文件,需要通过多段操作来分段上传。

默认取值:

如果不设置,则SDK会自动计算对象数据的长度。

contentType

String

可选

参数解释:

对象的文件类型(MIME类型)。contentType(MIME)用于标识发送或接收数据的类型,浏览器根据该参数来决定数据的打开方式。

取值范围:

常见的contentType(MIME)列表参见如何理解Content-Type(MIME)?(Java SDK)

默认取值:

如果未指定Content-Type,SDK会根据指定Object名称的后缀来判定文件类型并自动填充Content-Type(如.xml判断为application/xml文件;.html判断为text/html文件)。

contentEncoding

String

可选

参数解释:

响应中的Content-Encoding头。指定对象内容编码格式。

默认取值:

contentDisposition

String

可选

参数解释:

为请求的对象提供一个默认的文件名赋值给该对象,当下载对象或者访问对象时,以默认文件名命名的文件将直接在浏览器上显示,或在弹出文件下载对话框时显示。

默认取值:

cacheControl

String

可选

参数解释:

响应中的Cache-Control头。指定对象被下载时的网页的缓存行为。

默认取值:

contentLanguage

String

可选

参数解释:

说明访问者希望采用的语言或语言组合,以根据自己偏好的语言来定制。详情请参见HTTP协议中关于ContentLanguage的定义。

默认取值:

expires

String

可选

参数解释:

指对象在网页中的缓存过期时间。

约束限制:

日期格式为GMT的格式。

默认取值:

contentMd5

String

可选

参数解释:

对象数据的MD5值(经过Base64编码),提供给OBS服务端,校验数据完整性。OBS服务端会将该MD5值与对象数据计算出的MD5值进行对比,如果不匹配则上传失败,返回HTTP 400错误。

约束限制:

  • 对象数据的MD5值必须经过Base64编码。
  • 如果不设置对象的MD5值,OBS服务端会忽略对对象数据的MD5值校验。

取值范围:

按照RFC 1864标准计算出消息体的MD5摘要字符串,即消息体128-bit MD5值经过Base64编码后得到的字符串。

示例:n58IG6hfM7vqI4K0vnWpog==

默认取值:

storageClass

StorageClassEnum

可选

参数解释:

对象的存储类别。创建对象时,可以加上此头域设置对象的存储类别。如果未设置此头域,则以桶的默认存储类别作为对象的存储类别。

取值范围:

可选择的存储类别参见StorageClassEnum

默认取值:

webSiteRedirectLocation

String

可选

参数解释:

当桶设置了Website配置,可以将获取这个对象的请求重定向到桶内另一个对象或一个外部的URL,该参数指明对象的重定向地址。

例如,重定向请求到桶内另一对象:

WebsiteRedirectLocation:/anotherPage.html

或重定向请求到一个外部URL:

WebsiteRedirectLocation:http://www.example.com/

约束限制:

  • 必须以“/”、“http://”或“https://”开头,长度不超过2KB。
  • OBS仅支持为桶根目录下的对象设置重定向,不支持为桶中文件夹下的对象设置重定向。

默认取值:

nextPosition

long

可选

参数解释:

下次追加上传的位置。

取值范围:

0~对象长度,单位:字节。

认取值:

appendable

boolean

可选

参数解释:

对象是否为可追加上传的对象。

取值范围:

true:是,可追加上传。

false:否,不可追加上传。

认取值:

userMetadata

Map<String, Object>

可选

参数解释:

对象的自定义元数据,OBS支持用户使用以“x-obs-meta-”开头的消息头来加入自定义的元数据,以便对对象进行自定义管理。Map中的String代表以“x-obs-meta-”开头的自定义元数据名称,Object代表自定义元数据的值。对象的自定义元数据可以通过ObsClient.getObjectMetadata获取,参见获取对象元数据

约束限制:

  • 一个对象可以有多个元数据,总大小不能超过8KB。
  • 使用ObsClient.getObject下载对象时,对象的自定义元数据也会同时下载。

认取值:

表20 StorageClassEnum

常量名

原始值

说明

STANDARD

STANDARD

标准存储。

WARM

WARM

低频访问存储。

COLD

COLD

归档存储。

表21 ACL预定义访问策略

常量名

说明

AccessControlList.REST_CANNED_PRIVATE

私有读写。

桶或对象的所有者拥有完全控制的权限,其他任何人都没有访问权限。

AccessControlList.REST_CANNED_PUBLIC_READ

公共读。

设在桶上,所有人可以获取该桶内对象列表、桶内多段任务、桶的元数据、桶的多版本。

设在对象上,所有人可以获取该对象内容和元数据。

AccessControlList.REST_CANNED_PUBLIC_READ_WRITE

公共读写。

设在桶上,所有人可以获取该桶内对象列表、桶内多段任务、桶的元数据、上传对象删除对象、初始化段任务、上传段、合并段、拷贝段、取消多段上传任务。

设在对象上,所有人可以获取该对象内容和元数据。

AccessControlList.REST_CANNED_PUBLIC_READ_DELIVERED

桶公共读,桶内对象公共读。

设在桶上,所有人可以获取该桶内对象列表、桶内多段任务、桶的元数据,可以获取该桶内对象的内容和元数据。

不能应用于对象。

AccessControlList.REST_CANNED_PUBLIC_READ_WRITE_DELIVERED

桶公共读写,桶内对象公共读写。

设在桶上,所有人可以获取该桶内对象列表、桶内多段任务、桶的元数据、上传对象、删除对象、初始化段任务、上传段、合并段、拷贝段、取消多段上传任务,可以获取该桶内对象的内容和元数据。

不能应用于对象。

返回结果说明

表22 PutObjectResult

参数名称

参数类型

描述

statusCode

int

参数解释:

HTTP状态码。

取值范围:

状态码是一组从2xx(成功)到4xx或5xx(错误)的数字代码,状态码表示了请求响应的状态。

完整的状态码列表请参见状态码

默认取值:

responseHeaders

Map<String, Object>

参数解释:

响应消息头列表,由多个元组构成。元组中String代表响应消息头的名称,Object代表响应消息头的值。

默认取值:

storageClass

StorageClassEnum

参数解释:

对象的存储类别。创建对象时,可以加上此头域设置对象的存储类别。如果未设置此头域,则以桶的默认存储类别作为对象的存储类别。

取值范围:

可选择的存储类别参见StorageClassEnum

默认取值:

versionId

String

参数解释:

对象的版本号。如果桶的多版本状态为开启,则会返回对象的版本号。

取值范围:

长度为32的字符串。

默认取值:

etag

String

参数解释:

对象的etag值,即Base64编码的128位MD5摘要。etag是对象内容的唯一标识,可以通过该值识别对象内容是否有变化。比如上传对象时etag为A,下载对象时etag为B,则说明对象内容发生了变化。etag只反映变化的内容,而不是其元数据。上传的对象或拷贝操作创建的对象,都有唯一的etag。

约束限制:

当对象是服务端加密的对象时,etag值不是对象的MD5值。

取值范围:

长度为32的字符串。

默认取值:

objectKey

String

参数解释:

对象名。对象名是对象在存储桶中的唯一标识。对象名是对象在桶中的完整路径,路径中不包含桶名。

例如,您对象的访问地址为examplebucket.obs.ap-southeast-1.myhuaweicloud.com/folder/test.txt 中,对象名为folder/test.txt。

取值范围:

长度大于0且不超过1024的字符串。

默认取值:

bucketName

String

参数解释

桶名。

约束限制:

  • 桶的名字需全局唯一,不能与已有的任何桶名称重复,包括其他用户创建的桶。
  • 桶命名规则如下:
    • 3~63个字符,数字或字母开头,支持小写字母、数字、“-”、“.”。
    • 禁止使用IP地址。
    • 禁止以“-”或“.”开头及结尾。
    • 禁止两个“.”相邻(如:“my..bucket”)。
    • 禁止“.”和“-”相邻(如:“my-.bucket”和“my.-bucket”)。
  • 同一用户在同一个区域多次创建同名桶不会报错,创建的桶属性以第一次请求为准。

默认取值:

代码示例

文件上传使用本地文件作为对象的数据源。以下代码展示了将本地文件localfile上传到examplebucket桶中。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import com.obs.services.ObsClient;
import com.obs.services.exception.ObsException;
import com.obs.services.model.PutObjectRequest;
import java.io.File;
public class PutObject004 {
    public static void main(String[] args) {
        // 您可以通过环境变量获取访问密钥AK/SK,也可以使用其他外部引入方式传入。如果使用硬编码可能会存在泄露风险。
        // 您可以登录访问管理控制台获取访问密钥AK/SK
        String ak = System.getenv("ACCESS_KEY_ID");
        String sk = System.getenv("SECRET_ACCESS_KEY_ID");
        // 【可选】如果使用临时AK/SK和SecurityToken访问OBS,同样建议您尽量避免使用硬编码,以降低信息泄露风险。
        // 您可以通过环境变量获取访问密钥AK/SK/SecurityToken,也可以使用其他外部引入方式传入。
        // String securityToken = System.getenv("SECURITY_TOKEN");
        // endpoint填写桶所在的endpoint, 此处以中国-香港为例,其他地区请按实际情况填写。
        String endPoint = "https://obs.ap-southeast-1.myhuaweicloud.com";
        // 您可以通过环境变量获取endPoint,也可以使用其他外部引入方式传入。
        //String endPoint = System.getenv("ENDPOINT");
        
        // 创建ObsClient实例
        // 使用永久AK/SK初始化客户端
        ObsClient obsClient = new ObsClient(ak, sk,endPoint);
        // 使用临时AK/SK和SecurityToken初始化客户端
        // ObsClient obsClient = new ObsClient(ak, sk, securityToken, endPoint);

        try {
            // 文件上传
            // localfile 为待上传的本地文件路径,需要指定到具体的文件名
            PutObjectRequest request = new PutObjectRequest();
            request.setBucketName("examplebucket");
            request.setObjectKey("objectkey");
            request.setFile(new File("localfile"));
            obsClient.putObject(request);
            System.out.println("putObject successfully");
        } catch (ObsException e) {
            System.out.println("putObject failed");
            // 请求失败,打印http状态码
            System.out.println("HTTP Code:" + e.getResponseCode());
            // 请求失败,打印服务端错误码
            System.out.println("Error Code:" + e.getErrorCode());
            // 请求失败,打印详细错误信息
            System.out.println("Error Message:" + e.getErrorMessage());
            // 请求失败,打印请求id
            System.out.println("Request ID:" + e.getErrorRequestId());
            System.out.println("Host ID:" + e.getErrorHostId());
            e.printStackTrace();
        } catch (Exception e) {
            System.out.println("putObject failed");
            // 其他异常信息打印
            e.printStackTrace();
        }
    }
}

相关链接

  • 关于上传对象-POST上传的API说明,请参见POST上传
  • 更多关于上传对象的示例代码,请参见Github示例
  • 上传对象过程中返回的错误码含义、问题原因及处理措施可参考OBS错误码
  • 上传对象常见问题请参见上传对象失败