Skip to content

S3 API 文档

MyObj 提供完整的 AWS S3 兼容 API,支持所有 S3 标准操作。

基础信息

  • Endpoint: http://your-domain:8080 (共用端口) 或 http://your-domain:9000 (独立端口)
  • Region: 在 config.toml 中配置(默认 us-east-1
  • 认证: AWS Signature V4
  • Access Key ID: MyObj API Key
  • Secret Access Key: API Key 私钥

Bucket 操作

ListBuckets

列出所有 Bucket。

GET /

CreateBucket

创建 Bucket。

PUT /{bucket}

HeadBucket

检查 Bucket 是否存在。

HEAD /{bucket}

DeleteBucket

删除空 Bucket。

DELETE /{bucket}

Object 操作

PutObject

上传对象。

PUT /{bucket}/{key}
Content-Type: application/octet-stream
Content-MD5: {md5-hash}  # 可选

{object-data}

GetObject

下载对象。

GET /{bucket}/{key}
Range: bytes=0-1023  # 可选,支持 Range 请求

HeadObject

获取对象元数据。

HEAD /{bucket}/{key}

DeleteObject

删除对象。

DELETE /{bucket}/{key}

ListObjects / ListObjectsV2

列出对象。

GET /{bucket}?list-type=2&prefix={prefix}&delimiter={delimiter}

Multipart Upload

InitiateMultipartUpload

初始化分片上传。

POST /{bucket}/{key}?uploads

UploadPart

上传分片。

PUT /{bucket}/{key}?partNumber={partNumber}&uploadId={uploadId}
Content-MD5: {md5-hash}  # 可选

{part-data}

CompleteMultipartUpload

完成分片上传。

POST /{bucket}/{key}?uploadId={uploadId}

<CompleteMultipartUpload>
  <Part>
    <PartNumber>1</PartNumber>
    <ETag>{etag}</ETag>
  </Part>
  ...
</CompleteMultipartUpload>

AbortMultipartUpload

取消分片上传。

DELETE /{bucket}/{key}?uploadId={uploadId}

ListParts

列出分片。

GET /{bucket}/{key}?uploadId={uploadId}

ListMultipartUploads

列出分片上传会话。

GET /{bucket}?uploads

高级功能

CopyObject

复制对象。

PUT /{bucket}/{dest-key}
x-amz-copy-source: /{source-bucket}/{source-key}
x-amz-metadata-directive: COPY|REPLACE  # 可选

DeleteObjects

批量删除对象。

POST /{bucket}?delete

<Delete>
  <Object>
    <Key>{key1}</Key>
  </Object>
  <Object>
    <Key>{key2}</Key>
  </Object>
</Delete>

版本控制

PutBucketVersioning

启用/禁用版本控制。

PUT /{bucket}?versioning

<VersioningConfiguration>
  <Status>Enabled</Status>
</VersioningConfiguration>

ListObjectVersions

列出对象版本。

GET /{bucket}?versions&prefix={prefix}

GetObject (指定版本)

获取特定版本的对象。

GET /{bucket}/{key}?versionId={versionId}

预签名 URL

预签名 URL 通过 SDK 生成,格式:

GET /{bucket}/{key}?X-Amz-Algorithm=...&X-Amz-Credential=...&X-Amz-Date=...&X-Amz-Expires=...&X-Amz-SignedHeaders=...&X-Amz-Signature=...

CORS

PutBucketCORS

设置 CORS 配置。

PUT /{bucket}?cors

<CORSConfiguration>
  <CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedMethod>PUT</AllowedMethod>
    <AllowedHeader>*</AllowedHeader>
    <MaxAgeSeconds>3600</MaxAgeSeconds>
  </CORSRule>
</CORSConfiguration>

GetBucketCORS

获取 CORS 配置。

GET /{bucket}?cors

对象标签

PutObjectTagging

设置对象标签。

PUT /{bucket}/{key}?tagging

<Tagging>
  <TagSet>
    <Tag>
      <Key>key1</Key>
      <Value>value1</Value>
    </Tag>
  </TagSet>
</Tagging>

GetObjectTagging

获取对象标签。

GET /{bucket}/{key}?tagging

ACL

PutBucketACL

设置 Bucket ACL。

PUT /{bucket}?acl

<AccessControlPolicy>
  <AccessControlList>
    <Grant>
      <Grantee>
        <ID>{user-id}</ID>
      </Grantee>
      <Permission>READ</Permission>
    </Grant>
  </AccessControlList>
</AccessControlPolicy>

GetBucketACL

获取 Bucket ACL。

GET /{bucket}?acl

Bucket 策略

PutBucketPolicy

设置 Bucket 策略。

PUT /{bucket}?policy

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::{bucket}/*"
    }
  ]
}

GetBucketPolicy

获取 Bucket 策略。

GET /{bucket}?policy

认证

所有请求都需要使用 AWS Signature V4 签名:

Authorization: AWS4-HMAC-SHA256 Credential={access-key-id}/{date}/{region}/s3/aws4_request, SignedHeaders={headers}, Signature={signature}

详细签名算法请参考 AWS Signature Version 4

错误响应

S3 API 使用标准 S3 错误格式:

xml
<Error>
  <Code>NoSuchBucket</Code>
  <Message>The specified bucket does not exist</Message>
  <Resource>{bucket}</Resource>
  <RequestId>{request-id}</RequestId>
</Error>

使用示例

使用 MinIO SDK

go
package main

import (
    "context"
    "log"
    
    "github.com/minio/minio-go/v7"
    "github.com/minio/minio-go/v7/pkg/credentials"
)

func main() {
    client, err := minio.New("localhost:8080", &minio.Options{
        Creds:  credentials.NewStaticV4("access-key", "secret-key", ""),
        Secure: false,
        Region: "us-east-1",
    })
    if err != nil {
        log.Fatal(err)
    }
    
    ctx := context.Background()
    
    // 创建 Bucket
    err = client.MakeBucket(ctx, "my-bucket", minio.MakeBucketOptions{})
    if err != nil {
        log.Fatal(err)
    }
    
    // 上传对象
    _, err = client.FPutObject(ctx, "my-bucket", "object-key", "local-file.txt", minio.PutObjectOptions{})
    if err != nil {
        log.Fatal(err)
    }
    
    log.Println("Upload successful")
}

使用 AWS SDK

go
package main

import (
    "context"
    "log"
    
    "github.com/aws/aws-sdk-go-v2/aws"
    "github.com/aws/aws-sdk-go-v2/config"
    "github.com/aws/aws-sdk-go-v2/credentials"
    "github.com/aws/aws-sdk-go-v2/service/s3"
)

func main() {
    cfg, err := config.LoadDefaultConfig(context.TODO(),
        config.WithEndpointResolverWithOptions(aws.EndpointResolverWithOptionsFunc(
            func(service, region string, options ...interface{}) (aws.Endpoint, error) {
                return aws.Endpoint{
                    URL:           "http://localhost:8080",
                    SigningRegion: "us-east-1",
                }, nil
            },
        )),
        config.WithCredentialsProvider(credentials.NewStaticCredentialsProvider(
            "access-key",
            "secret-key",
            "",
        )),
    )
    if err != nil {
        log.Fatal(err)
    }
    
    client := s3.NewFromConfig(cfg)
    
    // 列出 Bucket
    result, err := client.ListBuckets(context.TODO(), &s3.ListBucketsInput{})
    if err != nil {
        log.Fatal(err)
    }
    
    for _, bucket := range result.Buckets {
        log.Printf("Bucket: %s\n", *bucket.Name)
    }
}

更多信息

基于 Apache 2.0 许可证发布