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}?uploadsUploadPart
上传分片。
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}?taggingACL
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}?aclBucket 策略
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)
}
}更多信息
- S3 使用指南 - 详细使用说明
- AWS S3 API 参考
- MinIO Go SDK 文档
