对象存储SDK
本文介绍英博云对象存储提供的主流语言SDK。
前提条件
- 已创建访问密钥。若尚未创建请参考创建密钥。
SDK python 使用示例
注意:Python s3 sdk主要使用boto3库。
操作 | 说明 |
---|---|
CreateBucket | 新建桶 |
HeadBucket | 查询桶是否存在 |
DeleteBucket | 删除桶 |
CreateMultipartUpload | 创建分片上传任务生成upload ID |
UploadPart | 分片上传part内容 |
CompleteMultipartUpload | 完成分片上传,此操作后前步骤上传完成的片段将不再作为碎片存在 |
AbortMultipartUpload | 删除碎片 |
ListMultiparts | 查看未完成的分片上传任务 |
PutObject | 简单上传对象 |
GetObject | 获取对象 |
ListObjects | 获取对象列表 |
DeleteObject | 删除对象 |
DeleteObjects | 批量删除对象 |
安装
安装Python3
#python3 -- version
Python 3.12.1
安装依赖包boto3/botocore
pip3 install boto3
pip3 install botocore
初始化
初始化s3 client
import boto3
import requests
from botocore.config import Config
my_config = Config(
region_name='cn-bj-1',
signature_version='v4',
retries={
'max_attempts': 10,
'mode': 'standard'
}
)
client = boto3.client(
's3',
endpoint_url=endpoint,
aws_access_key_id=access_key,
aws_secret_access_key=secret_key,
config=my_config
)
功能操作样例
- CreateBucket
client.create_bucket(Bucket=bucketname)
参数说明:
- Bucket(required):3-63位由小写字母/数字/‘-’组成的字符串;
- Headbucket
client.head_bucket(Bucket=bucketname)
参数说明:
- Bucket(required):string
- DeleteBucket
client.delete_bucket(Bucket=bucketname)
参数说明:
- Bucket(required):string
- CreateMultipartUpload
client.create_multipart_upload(
Bucket='string',
Key='string',
)
参数说明:
- Bucket(required):string
- Key(required):string
- UploadPart
client.upload_part(
Body=b'bytes'|file,
Key='string',
PartNumber=123,
UploadId='string',
)
参数说明:
- Bucket(required):string
- Key(required):string
- Body(required): Bytes or string(需要上传的内容)
- PartNumber(required):integer(Part number of part being uploaded)
- UploadId(required):string (由create multipart upload接口生成得到)
- CompleteMultipartUpload
client.complete_multipart_upload(
Bucket='string',
Key='string',
MultipartUpload={
'Parts': [
{'ETag': 'string',
'PartNumber': 123}
]},
UploadId='string',
)
参数说明:
- Bucket(required):string
- Key(required):string
- MultipartUpload(required):
- Parts (list):
- PartNumber(required):integer(Part number of part being uploaded)
- ETag(required):string(Entity tag returned when the part was uploaded.)
- Parts (list):
- UploadId(required):string (由create multipart upload接口生成得到)
- AbortMultipartUpload
client.abort_multipart_upload(
Bucket='string',
Key='string',
UploadId='string',
)
参数说明:
- Bucket(required):string
- Key(required):string
- UploadId(required):string (由create multipart upload接口生成得到)
- ListMultiparts
client.list_multipart_uploads(
Bucket='string'
)
参数说明:
- Bucket(required):string
- PutObject
client.put_object(
Body=b'bytes'|file,
Bucket='string',
Key='string'
)
参数说明:
- Bucket(required):string
- Key(required):string
- Body(required): Bytes or string(需要上传的内容)
- GetObject
client.get_object(
Bucket='string',
Key='string'
)
参数说明:
- Bucket(required):string
- Key(required):string
- ListObjects
client.list_objects(
Bucket='string'
)
参数说明:
- Bucket(required):string
- DeleteObject
client.delete_object(
Bucket='string',
Key='string'
)
参数说明:
- Bucket(required):string
- Key(required):string
- DeleteObjects
client.delete_objects(
Bucket='string',
Delete={'Objects': [
{'Key': 'string'},
]},
)
参数说明:
- Bucket(required):string
- Delete(dict) (required):
- Objects(list):
- Key(required):string
- Objects(list):
已知问题
- 对象名称长度需要小于或等于256位;
- 上传带前缀的对象后不能再上传名称为已存在的前缀,否则会请求失败
- 不允许上传名称包含以‘/’结尾的对象;
SDK GO使用示例
安装
import "github.com/aws/aws-sdk-go/service/s3"
import "github.com/aws/aws-sdk-go/aws"
import "github.com/aws/aws-sdk-go/aws/credentials"
import "github.com/aws/aws-sdk-go/aws/session"
初始化
type S3Client struct {
Client *s3.S3
}
func NewS3Client(ak, sk, enpoint, region string) *S3Client {
creds := credentials.NewStaticCredentials(ak, sk, "")
// By default make sure a region is specified
s3client := s3.New(session.Must(session.NewSession(
&aws.Config{
Credentials: creds,
DisableSSL: aws.Bool(true),
Endpoint: aws.String(enpoint),
Region: aws.String(region),
S3ForcePathStyle: aws.Bool(true),
},
),
),
)
return &S3Client{s3client}
}
功能操作样例
- CreateBucket
func (s3client *S3Client) create_bucket(bucketname string) error {
param := &s3.CreateBucketInput{
Bucket: aws.String(bucketname),
}
_, err := s3client.Client.CreateBucket(param)
if err != nil {
return err
}
return nil
}
func Test_create_bucket() {
svc := NewS3Client(access_key, access_secret_key, endpoint, region)
err := svc.create_bucket("newbucket")
if err != nil {
panic(err)
}
参数说明:
- Bucket(required):3-63位由小写字母/数字/‘-’组成的字符串;
- Headbucket
func (s3client *S3Client) head_bucket(bucket string) (out *s3.HeadBucketOutput, err error) {
param := &s3.HeadBucketInput{
Bucket: aws.String(bucket),
}
msg, err := s3client.Client.HeadBucket(param)
if err != nil {
return nil, err
}
return msg, nil
}
func Test_head_bucket() {
svc := NewS3Client(access_key, access_secret_key, endpoint, region)
out, err := svc.head_bucket("newbucket")
if err != nil {
panic(err)
}
fmt.Println(out)
}
参数说明:
- Bucket(required):string
- DeleteBucket
func (s3client *S3Client) delete_bucket(bucket string) error {
param := &s3.DeleteBucketInput{
Bucket: aws.String(bucket),
}
_, err := s3client.Client.DeleteBucket(param)
if err != nil {
return err
}
return nil
}
func Test_delete_bucket() {
svc := NewS3Client(access_key, access_secret_key, endpoint, region)
err := svc.delete_bucket("newbucket")
if err != nil {
panic(err)
}
}
参数说明:
- Bucket(required):string
- CreateMultipartUpload请求示例:
func (s3client *S3Client) create_multipart_upload(bucket, key string) (out *s3.CreateMultipartUploadOutput, err error) {
param := &s3.CreateMultipartUploadInput{
Bucket: aws.String(bucket),
Key: aws.String(key),
}
out, err = s3client.Client.CreateMultipartUpload(param)
if err != nil {
return nil, err
}
return out, nil
}
func Test_create_multipart_upload() {
svc := NewS3Client(access_key, access_secret_key, endpoint, region)
out, err := svc.create_multipart_upload("newbucket", "testkey")
if err != nil {
panic(err)
}
fmt.Println(out)
}
reponse示例:
{
Bucket: "newbucket",
Key: "testkey",
UploadId: "35257419-8b92-4aea-a342-daa7a76857d6"
}
参数说明:
- Bucket(required):string
- Key(required):string
- UploadPart
func (s3client *S3Client) upload_part(bucket, key, uploadid string, body []byte, partnum int64) (out *s3.UploadPartOutput, err error) {
param := &s3.UploadPartInput{
Bucket: aws.String(bucket),
Key: aws.String(key),
Body: aws.ReadSeekCloser(bytes.NewReader(body)),
UploadId: aws.String(uploadid),
PartNumber: aws.Int64(partnum),
}
out, err = s3client.Client.UploadPart(param)
if err != nil {
return nil, err
}
return out, nil
}
func Test_upload_part() {
svc := NewS3Client(access_key, access_secret_key, endpoint, region)
body := make([]byte, 5242880)
out, err := svc.upload_part("newbucket", "testkey", "35257419-8b92-4aea-a342-daa7a76857d6", body, 1)
if err != nil {
panic(err)
}
fmt.Println(out)
}
返回示例:
{
ETag: "5f363e0e58a95f06cbe9bbc662c5dfb6"
}
参数说明:
- Bucket(required):string
- Key(required):string
- Body(required): Bytes or string(需要上传的内容)
- PartNumber(required):integer(Part number of part being uploaded)
- UploadId(required):string (由create multipart upload接口生成得到)
- CompleteMultipartUpload
func (s3client *S3Client) Complete_multipart_upload(bucket, key, uploadid, etag string, partnum int64) (out *s3.CompleteMultipartUploadOutput, err error) {
param := &s3.CompleteMultipartUploadInput{
UploadId: aws.String(uploadid),
Bucket: aws.String(bucket),
Key: aws.String(key),
MultipartUpload: &s3.CompletedMultipartUpload{
Parts: []*s3.CompletedPart{
{
PartNumber: aws.Int64(partnum), // 替换为分段的编号
ETag: aws.String(etag), // 替换为对应分段的 ETag
},
// 添加更多的 CompletedPart,具体根据你的需求添加
},
},
}
out, err = s3client.Client.CompleteMultipartUpload(param)
if err != nil {
return nil, err
}
return out, nil
}
func Test_complete_multipar_upload() {
svc := NewS3Client(access_key, access_secret_key, endpoint, region)
out, err := svc.Complete_multipart_upload("newbucket", "testkey", "35257419-8b92-4aea-a342-daa7a76857d6", "5f363e0e58a95f06cbe9bbc662c5dfb6", 1)
if err != nil {
panic(err)
}
fmt.Println(out)
}
参数说明:
- Bucket(required):string
- Key(required):string
- MultipartUpload(required):
- Parts (list):
- PartNumber(required):integer(Part number of part being uploaded)
- ETag(required):string(Entity tag returned when the part was uploaded.)
- Parts (list):
- UploadId(required):string (由create multipart upload接口生成得到)
- AbortMultipartUpload
func (s3client *S3Client) abort_multipart_upload(uploadid, bucket, key string) error {
param := &s3.AbortMultipartUploadInput{
UploadId: aws.String(uploadid),
Bucket: aws.String(bucket),
Key: aws.String(key),
}
_, err := s3client.Client.AbortMultipartUpload(param)
if err != nil {
return err
}
return nil
}
func Test_abort_multipart_upload() {
svc := NewS3Client(access_key, access_secret_key, endpoint, region)
err := svc.abort_multipart_upload("c58031f9-131b-4a57-b9c7-63e5bc0b7f0d", "newbucket", "testkey")
if err != nil {
panic(err)
}
}
参数说明:
- Bucket(required):string
- Key(required):string
- UploadId(required):string (由create multipart upload接口生成得到)
- ListMultiparts
func (s3client *S3Client) list_multipart_uploads(bucket string) (out *s3.ListMultipartUploadsOutput, err error) {
param := &s3.ListMultipartUploadsInput{
Bucket: aws.String(bucket),
}
out, err = s3client.Client.ListMultipartUploads(param)
if err != nil {
return nil, err
}
return out, nil
}
func Test_list_multipart_uploads(t *testing.T) {
svc := NewS3Client(access_key, access_secret_key, endpoint, region)
out, err := svc.list_multipart_uploads("newbucket")
if err != nil {
panic(err)
}
fmt.Println(out)
}
参数说明:
- Bucket(required):string
- PutObject
func (s3client *S3Client) put_object(bucket, key, body string) error {
param := &s3.PutObjectInput{
Body: aws.ReadSeekCloser(strings.NewReader(body)),
Bucket: aws.String(bucket),
Key: aws.String(key),
}
_, err := s3client.Client.PutObject(param)
if err != nil {
return err
}
return nil
}
func Test_put_object() {
svc := NewS3Client(access_key, access_secret_key, endpoint, region)
err := svc.put_object("newbucket", "testkey2", "this is a put test")
if err != nil {
panic(err)
}
fmt.Println("put object success")
}
参数说明:
- Bucket(required):string
- Key(required):string
- Body(required): Bytes or string(需要上传的内容)
- GetObject
func (s3client *S3Client) get_object(bucket, key string) (out *s3.GetObjectOutput, err error) {
param := &s3.GetObjectInput{
Bucket: aws.String(bucket),
Key: aws.String(key),
}
out, err = s3client.Client.GetObject(param)
if err != nil {
return nil, err
}
return out, nil
func Test_get_object() {
svc := NewS3Client(access_key, access_secret_key, endpoint, region)
body, err := svc.get_object("newbucket", "testkey2")
if err != nil {
panic(err)
}
value, err := ioutil.ReadAll(body.Body)
fmt.Println(string(value))
}
参数说明:
- Bucket(required):string
- Key(required):string
- ListObjects
func (s3client *S3Client) list_objects(bucket string) (out *s3.ListObjectsOutput, err error) {
param := &s3.ListObjectsInput{
Bucket: aws.String(bucket),
}
out, err = s3client.Client.ListObjects(param)
if err != nil {
return nil, err
}
return
func Test_list_objects() {
svc := NewS3Client(access_key, access_secret_key, endpoint, region)
out, err := svc.list_objects("newbucket")
if err != nil {
panic(err)
}
fmt.Println(out)
}
参数说明:
- Bucket(required):string
- DeleteObject
func (s3client *S3Client) delete_object(bucket, key string) error {
param := &s3.DeleteObjectInput{
Bucket: aws.String(bucket),
Key: aws.String(key),
}
_, err := s3client.Client.DeleteObject(param)
if err != nil {
return err
}
return nil
}
func Test_delete_object() {
svc := NewS3Client(access_key, access_secret_key, endpoint, region)
err := svc.delete_object("newbucket", "testkey2")
if err != nil {
panic(err)
}
fmt.Println("delete ok!")
}
参数说明:
- Bucket(required):string
- Key(required):string
- DeleteObjects
func (s3client *S3Client) delete_objects(bucket string, keys []string) (out *s3.DeleteObjectsOutput, err error) {
param := &s3.DeleteObjectsInput{
Bucket: aws.String(bucket),
Delete: &s3.Delete{
Objects: make([]*s3.ObjectIdentifier, len(keys)),
},
}
for i, key := range keys {
param.Delete.Objects[i] = &s3.ObjectIdentifier{Key: aws.String(key)}
}
out, err = s3client.Client.DeleteObjects(param)
if err != nil {
return nil, err
}
return out, nil
}
func Test_delete_objects() {
svc := NewS3Client(access_key, access_secret_key, endpoint, region)
out, err := svc.delete_objects("newbucket", []string{"testkey", "testkey2"})
if err != nil {
panic(err)
}
fmt.Println(out)
}
参数说明:
- Bucket(required):string