-
Notifications
You must be signed in to change notification settings - Fork 1
/
oss.go
134 lines (115 loc) · 2.69 KB
/
oss.go
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
package main
import (
"bytes"
"errors"
"fmt"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
"io"
"os"
"strconv"
)
type Oss interface {
Stat(fname string) error
Size(fname string) uint64
Create(name string) (io.WriteCloser, error)
Open(name string) (io.ReadCloser, error)
}
type LocalOss struct {
Base string
}
func NewLocalOss(base string) Oss {
oss := &LocalOss{}
oss.Base = base
return oss
}
func (l *LocalOss) Stat(fname string) error {
fn := fmt.Sprintf("%s/%s", l.Base, fname)
_, err := os.Stat(fn)
return err
}
func (l *LocalOss) Size(fname string) uint64 {
return 0
}
func (l *LocalOss) Create(name string) (io.WriteCloser, error) {
fn := fmt.Sprintf("%s/%s", l.Base, name)
return os.Create(fn)
}
func (l *LocalOss) Open(name string) (io.ReadCloser, error) {
fn := fmt.Sprintf("%s/%s", l.Base, name)
return os.Open(fn)
}
func MakeOss(config OssConfig) Oss {
if config.Type == "local" {
return NewLocalOss(config.EndPoint)
} else if config.Type == "aliyun" {
return NewAliyunOss(config)
} else {
Fatal(fmt.Sprintf("oss type '%s' is not implemented", config.Type))
return nil
}
}
type AliyunOss struct {
Key string
Secret string
BucketName string
EndPoint string
client *oss.Client
bucket *oss.Bucket
}
type AliyunFile struct {
key string
bucket *oss.Bucket
buffer bytes.Buffer
}
func NewAliyunFile(name string, bucket *oss.Bucket) io.WriteCloser {
f := &AliyunFile{}
f.bucket = bucket
f.key = name
return f
}
func (af *AliyunFile) Write(input []byte) (int, error) {
af.buffer.Write(input)
return len(input), nil
}
func (af *AliyunFile) Close() error {
return af.bucket.PutObject(af.key, &af.buffer)
}
func NewAliyunOss(config OssConfig) Oss {
aliyun := &AliyunOss{}
aliyun.Key = config.Key
aliyun.Secret = config.Secret
aliyun.BucketName = config.Bucket
aliyun.EndPoint = config.EndPoint
if client, err := oss.New(config.EndPoint, config.Key, config.Secret); err != nil {
panic(err.Error())
} else {
aliyun.client = client
}
if bucket, err := aliyun.client.Bucket(config.Bucket); err != nil {
panic(err.Error())
} else {
aliyun.bucket = bucket
}
return aliyun
}
func (a *AliyunOss) Stat(fname string) error {
if ok, _ := a.bucket.IsObjectExist(fname); ok {
return nil
} else {
return errors.New("no such file")
}
}
func (a *AliyunOss) Size(fname string) uint64 {
if head, err := a.bucket.GetObjectMeta(fname); err == nil {
v, _ := strconv.Atoi(head["Content-Length"][0])
return uint64(v)
} else {
return 0
}
}
func (a *AliyunOss) Create(name string) (io.WriteCloser, error) {
return NewAliyunFile(name, a.bucket), nil
}
func (a *AliyunOss) Open(name string) (io.ReadCloser, error) {
return a.bucket.GetObject(name)
}