mirror of
https://github.com/nabbar/golib.git
synced 2025-12-24 11:51:02 +08:00
AWS : add method to update metadata (copy object)
AWS : add method for website object (update redirection & acl) AWS : fix bug with missing content-type (all defined as application/octet-stream)
This commit is contained in:
@@ -28,10 +28,10 @@ package object
|
||||
import (
|
||||
"regexp"
|
||||
|
||||
"github.com/nabbar/golib/errors"
|
||||
liberr "github.com/nabbar/golib/errors"
|
||||
)
|
||||
|
||||
func (cli *client) Find(pattern string) ([]string, errors.Error) {
|
||||
func (cli *client) Find(pattern string) ([]string, liberr.Error) {
|
||||
var (
|
||||
result = make([]string, 0)
|
||||
token = ""
|
||||
|
||||
@@ -32,33 +32,36 @@ import (
|
||||
sdkiam "github.com/aws/aws-sdk-go-v2/service/iam"
|
||||
sdksss "github.com/aws/aws-sdk-go-v2/service/s3"
|
||||
sdktps "github.com/aws/aws-sdk-go-v2/service/s3/types"
|
||||
"github.com/nabbar/golib/aws/helper"
|
||||
"github.com/nabbar/golib/errors"
|
||||
libhlp "github.com/nabbar/golib/aws/helper"
|
||||
liberr "github.com/nabbar/golib/errors"
|
||||
)
|
||||
|
||||
type client struct {
|
||||
helper.Helper
|
||||
libhlp.Helper
|
||||
iam *sdkiam.Client
|
||||
s3 *sdksss.Client
|
||||
}
|
||||
|
||||
type Object interface {
|
||||
Find(pattern string) ([]string, errors.Error)
|
||||
Size(object string) (size int64, err errors.Error)
|
||||
Find(pattern string) ([]string, liberr.Error)
|
||||
Size(object string) (size int64, err liberr.Error)
|
||||
|
||||
List(continuationToken string) ([]sdktps.Object, string, int64, errors.Error)
|
||||
Head(object string) (*sdksss.HeadObjectOutput, errors.Error)
|
||||
Get(object string) (*sdksss.GetObjectOutput, errors.Error)
|
||||
Put(object string, body io.Reader) errors.Error
|
||||
Delete(object string) errors.Error
|
||||
List(continuationToken string) ([]sdktps.Object, string, int64, liberr.Error)
|
||||
Head(object string) (*sdksss.HeadObjectOutput, liberr.Error)
|
||||
Get(object string) (*sdksss.GetObjectOutput, liberr.Error)
|
||||
Put(object string, body io.Reader) liberr.Error
|
||||
Delete(object string) liberr.Error
|
||||
|
||||
MultipartPut(object string, body io.Reader) errors.Error
|
||||
MultipartPutCustom(partSize helper.PartSize, object string, body io.Reader) errors.Error
|
||||
MultipartPut(object string, body io.Reader) liberr.Error
|
||||
MultipartPutCustom(partSize libhlp.PartSize, object string, body io.Reader) liberr.Error
|
||||
|
||||
UpdateMetadata(meta *sdksss.CopyObjectInput) liberr.Error
|
||||
SetWebsite(object, redirect string) liberr.Error
|
||||
}
|
||||
|
||||
func New(ctx context.Context, bucket, region string, iam *sdkiam.Client, s3 *sdksss.Client) Object {
|
||||
return &client{
|
||||
Helper: helper.New(ctx, bucket, region),
|
||||
Helper: libhlp.New(ctx, bucket, region),
|
||||
iam: iam,
|
||||
s3: s3,
|
||||
}
|
||||
|
||||
@@ -31,6 +31,8 @@ import (
|
||||
"crypto/md5"
|
||||
"encoding/base64"
|
||||
"io"
|
||||
"mime"
|
||||
"path/filepath"
|
||||
|
||||
//nolint #gci
|
||||
"os"
|
||||
@@ -55,6 +57,7 @@ func (cli *client) MultipartPutCustom(partSize libhlp.PartSize, object string, b
|
||||
rio libhlp.ReaderPartSize
|
||||
upl *sdksss.CreateMultipartUploadOutput
|
||||
err error
|
||||
tpe *string
|
||||
)
|
||||
|
||||
defer func() {
|
||||
@@ -63,9 +66,16 @@ func (cli *client) MultipartPutCustom(partSize libhlp.PartSize, object string, b
|
||||
}
|
||||
}()
|
||||
|
||||
if t := mime.TypeByExtension(filepath.Ext(object)); t == "" {
|
||||
tpe = sdkaws.String("application/octet-stream")
|
||||
} else {
|
||||
tpe = sdkaws.String(t)
|
||||
}
|
||||
|
||||
upl, err = cli.s3.CreateMultipartUpload(cli.GetContext(), &sdksss.CreateMultipartUploadInput{
|
||||
Key: sdkaws.String(object),
|
||||
Bucket: sdkaws.String(cli.GetBucketName()),
|
||||
Key: sdkaws.String(object),
|
||||
Bucket: sdkaws.String(cli.GetBucketName()),
|
||||
ContentType: tpe,
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
|
||||
@@ -27,15 +27,17 @@ package object
|
||||
|
||||
import (
|
||||
"io"
|
||||
"mime"
|
||||
"path/filepath"
|
||||
|
||||
sdkaws "github.com/aws/aws-sdk-go-v2/aws"
|
||||
sdksss "github.com/aws/aws-sdk-go-v2/service/s3"
|
||||
sdktps "github.com/aws/aws-sdk-go-v2/service/s3/types"
|
||||
"github.com/nabbar/golib/aws/helper"
|
||||
"github.com/nabbar/golib/errors"
|
||||
libhlp "github.com/nabbar/golib/aws/helper"
|
||||
liberr "github.com/nabbar/golib/errors"
|
||||
)
|
||||
|
||||
func (cli *client) List(continuationToken string) ([]sdktps.Object, string, int64, errors.Error) {
|
||||
func (cli *client) List(continuationToken string) ([]sdktps.Object, string, int64, liberr.Error) {
|
||||
in := sdksss.ListObjectsV2Input{
|
||||
Bucket: cli.GetBucketAws(),
|
||||
}
|
||||
@@ -55,7 +57,7 @@ func (cli *client) List(continuationToken string) ([]sdktps.Object, string, int6
|
||||
}
|
||||
}
|
||||
|
||||
func (cli *client) Get(object string) (*sdksss.GetObjectOutput, errors.Error) {
|
||||
func (cli *client) Get(object string) (*sdksss.GetObjectOutput, liberr.Error) {
|
||||
out, err := cli.s3.GetObject(cli.GetContext(), &sdksss.GetObjectInput{
|
||||
Bucket: cli.GetBucketAws(),
|
||||
Key: sdkaws.String(object),
|
||||
@@ -69,13 +71,13 @@ func (cli *client) Get(object string) (*sdksss.GetObjectOutput, errors.Error) {
|
||||
}()
|
||||
return nil, cli.GetError(err)
|
||||
} else if out.Body == nil {
|
||||
return nil, helper.ErrorResponse.Error(nil)
|
||||
return nil, libhlp.ErrorResponse.Error(nil)
|
||||
} else {
|
||||
return out, nil
|
||||
}
|
||||
}
|
||||
|
||||
func (cli *client) Head(object string) (*sdksss.HeadObjectOutput, errors.Error) {
|
||||
func (cli *client) Head(object string) (*sdksss.HeadObjectOutput, liberr.Error) {
|
||||
out, e := cli.s3.HeadObject(cli.GetContext(), &sdksss.HeadObjectInput{
|
||||
Bucket: cli.GetBucketAws(),
|
||||
Key: sdkaws.String(object),
|
||||
@@ -84,13 +86,13 @@ func (cli *client) Head(object string) (*sdksss.HeadObjectOutput, errors.Error)
|
||||
if e != nil {
|
||||
return nil, cli.GetError(e)
|
||||
} else if out.ETag == nil {
|
||||
return nil, helper.ErrorResponse.Error(nil)
|
||||
return nil, libhlp.ErrorResponse.Error(nil)
|
||||
} else {
|
||||
return out, nil
|
||||
}
|
||||
}
|
||||
|
||||
func (cli *client) Size(object string) (size int64, err errors.Error) {
|
||||
func (cli *client) Size(object string) (size int64, err liberr.Error) {
|
||||
var (
|
||||
h *sdksss.HeadObjectOutput
|
||||
)
|
||||
@@ -102,23 +104,32 @@ func (cli *client) Size(object string) (size int64, err errors.Error) {
|
||||
}
|
||||
}
|
||||
|
||||
func (cli *client) Put(object string, body io.Reader) errors.Error {
|
||||
func (cli *client) Put(object string, body io.Reader) liberr.Error {
|
||||
var tpe *string
|
||||
|
||||
if t := mime.TypeByExtension(filepath.Ext(object)); t == "" {
|
||||
tpe = sdkaws.String("application/octet-stream")
|
||||
} else {
|
||||
tpe = sdkaws.String(t)
|
||||
}
|
||||
|
||||
out, err := cli.s3.PutObject(cli.GetContext(), &sdksss.PutObjectInput{
|
||||
Bucket: cli.GetBucketAws(),
|
||||
Key: sdkaws.String(object),
|
||||
Body: body,
|
||||
Bucket: cli.GetBucketAws(),
|
||||
Key: sdkaws.String(object),
|
||||
Body: body,
|
||||
ContentType: tpe,
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
return cli.GetError(err)
|
||||
} else if out.ETag == nil {
|
||||
return helper.ErrorResponse.Error(nil)
|
||||
return libhlp.ErrorResponse.Error(nil)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (cli *client) Delete(object string) errors.Error {
|
||||
func (cli *client) Delete(object string) liberr.Error {
|
||||
if _, err := cli.Head(object); err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -130,3 +141,36 @@ func (cli *client) Delete(object string) errors.Error {
|
||||
|
||||
return cli.GetError(err)
|
||||
}
|
||||
|
||||
func (cli *client) UpdateMetadata(meta *sdksss.CopyObjectInput) liberr.Error {
|
||||
_, err := cli.s3.CopyObject(cli.GetContext(), meta)
|
||||
|
||||
return cli.GetError(err)
|
||||
}
|
||||
|
||||
func (cli *client) SetWebsite(object, redirect string) liberr.Error {
|
||||
var err error
|
||||
|
||||
_, err = cli.s3.PutObjectAcl(cli.GetContext(), &sdksss.PutObjectAclInput{
|
||||
Bucket: cli.GetBucketAws(),
|
||||
Key: sdkaws.String(object),
|
||||
ACL: sdktps.ObjectCannedACLPublicRead,
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
return cli.GetError(err)
|
||||
}
|
||||
|
||||
if redirect == "" {
|
||||
return nil
|
||||
}
|
||||
|
||||
meta := &sdksss.CopyObjectInput{
|
||||
Bucket: cli.GetBucketAws(),
|
||||
CopySource: sdkaws.String(cli.GetBucketName() + "/" + object),
|
||||
Key: sdkaws.String(object),
|
||||
WebsiteRedirectLocation: sdkaws.String(redirect),
|
||||
}
|
||||
|
||||
return cli.UpdateMetadata(meta)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user