对象存储SDK

本文介绍英博云对象存储提供的主流语言SDK。

前提条件

  • 已创建访问密钥。若尚未创建请参考创建密钥

SDK python 使用示例

注意:Python s3 sdk主要使用boto3库。

操作说明
CreateBucket新建桶
HeadBucket查询桶是否存在
DeleteBucket删除桶
CreateMultipartUpload创建分片上传任务生成upload ID
UploadPart分片上传part内容
CompleteMultipartUpload完成分片上传,此操作后前步骤上传完成的片段将不再作为碎片存在
AbortMultipartUpload删除碎片
ListMultiparts查看未完成的分片上传任务
PutObject简单上传对象
GetObject获取对象
ListObjects获取对象列表
DeleteObject删除对象
DeleteObjects批量删除对象

安装

安装Python3open in new window

#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
)

功能操作样例

  1. CreateBucket
client.create_bucket(Bucket=bucketname)

参数说明:

  • Bucket(required):3-63位由小写字母/数字/‘-’组成的字符串;
  1. Headbucket
client.head_bucket(Bucket=bucketname)

参数说明:

  • Bucket(required):string
  1. DeleteBucket
client.delete_bucket(Bucket=bucketname)

参数说明:

  • Bucket(required):string
  1. CreateMultipartUpload
client.create_multipart_upload(
    Bucket='string',
    Key='string',
)

参数说明:

  • Bucket(required):string
  • Key(required):string
  1. 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接口生成得到)
  1. 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.)
  • UploadId(required):string (由create multipart upload接口生成得到)
  1. AbortMultipartUpload
client.abort_multipart_upload(
    Bucket='string',
    Key='string',
    UploadId='string',
)

参数说明:

  • Bucket(required):string
  • Key(required):string
  • UploadId(required):string (由create multipart upload接口生成得到)
  1. ListMultiparts
client.list_multipart_uploads(
    Bucket='string'
)

参数说明:

  • Bucket(required):string
  1. PutObject
client.put_object(
    Body=b'bytes'|file,
    Bucket='string',
    Key='string'
)

参数说明:

  • Bucket(required):string
  • Key(required):string
  • Body(required): Bytes or string(需要上传的内容)
  1. GetObject
client.get_object(
   Bucket='string',
   Key='string' 
)

参数说明:

  • Bucket(required):string
  • Key(required):string
  1. ListObjects
client.list_objects(
    Bucket='string'
)

参数说明:

  • Bucket(required):string
  1. DeleteObject
client.delete_object(
   Bucket='string',
   Key='string' 
)

参数说明:

  • Bucket(required):string
  • Key(required):string
  1. DeleteObjects
client.delete_objects(
    Bucket='string',
    Delete={'Objects': [
        {'Key': 'string'},
        ]},
)

参数说明:

  • Bucket(required):string
  • Delete(dict) (required):
    • Objects(list):
      • Key(required):string

已知问题

  • 对象名称长度需要小于或等于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}
}

功能操作样例

  1. 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位由小写字母/数字/‘-’组成的字符串;
  1. 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
  1. 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
  1. 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
  1. 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接口生成得到)
  1. 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.)
  • UploadId(required):string (由create multipart upload接口生成得到)
  1. 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接口生成得到)
  1. 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
  1. 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(需要上传的内容)
  1. 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
  1. 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
  1. 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
  1. 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