zs3.go 1.6 KB
Newer Older
Vladimir Barsukov's avatar
s3  
Vladimir Barsukov committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
package zs3

import (
	"bytes"
	"fmt"
	"github.com/aws/aws-sdk-go/aws"
	"github.com/aws/aws-sdk-go/aws/credentials"
	"github.com/aws/aws-sdk-go/aws/session"
	"github.com/aws/aws-sdk-go/service/s3"
	"io"
)

type ZS3 struct {
	Buket string

	*s3.S3
}

type Object struct {
	Name        string
	Reader      io.ReadSeeker
	Bytes       []byte
	ContentType string
	ACL         string
}

func (z *ZS3) ZPutObject(o *Object) error {
	var body io.ReadSeeker

	if len(o.Name) == 0 {
		return fmt.Errorf("name empty")
	}

	if o.Reader != nil {
		body = o.Reader
	} else if len(o.Bytes) > 0 {
		body = bytes.NewReader(o.Bytes)
	} else {
		return fmt.Errorf("empty body")
	}

	s3Object := &s3.PutObjectInput{
		Bucket: aws.String(z.Buket),
		Key:    aws.String(o.Name),
		Body:   body,
	}

	if len(o.ContentType) > 0 {
		s3Object.ContentType = aws.String(o.ContentType)
	}

	if len(o.ACL) > 0 {
		s3Object.ACL = aws.String(o.ACL)
	}

	if _, err := z.PutObject(s3Object); err != nil {
		return err
	}

	return nil
}

func (z *ZS3) ZDeleteObject(name string) error {
	if _, err := z.DeleteObject(&s3.DeleteObjectInput{
		Bucket: aws.String(z.Buket),
		Key:    aws.String(name),
	}); err != nil {
		return err
	}

	return nil
}

func New(region, host, buket, key, secret string) *ZS3 {
	return &ZS3{
		Buket: buket,
		S3:    NewNative(region, host, key, secret),
	}
}

func NewNative(region, host, key, secret string) *s3.S3 {
	return s3.New(
		session.Must(session.NewSession()),
		aws.NewConfig().
			WithCredentials(credentials.NewStaticCredentials(key, secret, "")).
			WithEndpoint(host).
			WithRegion(region).
			WithS3ForcePathStyle(true),
	)
}