-
Notifications
You must be signed in to change notification settings - Fork 60
/
Copy pathoss.go
executable file
·156 lines (137 loc) · 3.58 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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
package CloudStore
import (
"errors"
"net/http"
"net/url"
"strconv"
"strings"
"time"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
type OSS struct {
AccessKey string
SecretKey string
Endpoint string
Bucket string
Domain string
Client *oss.Bucket
}
// New OSS
func NewOSS(accessKey, secretKey, endpoint, bucket, domain string) (o *OSS, err error) {
var client *oss.Client
if domain == "" {
domain = "https://" + bucket + "." + endpoint
}
domain = strings.TrimRight(domain, "/ ")
o = &OSS{
AccessKey: accessKey,
SecretKey: secretKey,
Endpoint: endpoint,
Bucket: bucket,
Domain: domain,
}
client, err = oss.New(endpoint, accessKey, secretKey)
if err != nil {
return
}
o.Client, err = client.Bucket(bucket)
return
}
func (o *OSS) IsExist(object string) (err error) {
var b bool
b, err = o.Client.IsObjectExist(objectRel(object))
if err != nil {
return
}
if !b {
return errors.New("file is not exist")
}
return
}
func (o *OSS) Upload(tmpFile, saveFile string, headers ...map[string]string) (err error) {
var opts []oss.Option
for _, header := range headers {
for k, v := range header {
switch strings.ToLower(k) {
case "content-type":
opts = append(opts, oss.ContentType(v))
case "content-encoding":
opts = append(opts, oss.ContentEncoding(v))
case "content-disposition":
opts = append(opts, oss.ContentDisposition(v))
// TODO: more
}
}
}
err = o.Client.PutObjectFromFile(strings.TrimLeft(saveFile, "./"), tmpFile, opts...)
return
}
func (o *OSS) Delete(objects ...string) (err error) {
_, err = o.Client.DeleteObjects(objects)
return
}
func (o *OSS) GetSignURL(object string, expire int64) (link string, err error) {
path := objectRel(object)
if expire <= 0 {
return o.Domain + "/" + path, nil
}
link, err = o.Client.SignURL(path, http.MethodGet, expire)
if err != nil {
return
}
if !strings.HasPrefix(link, o.Domain) {
if u, errU := url.Parse(link); errU == nil {
link = o.Domain + u.RequestURI()
}
}
return
}
func (o *OSS) Download(object string, savePath string) (err error) {
err = o.Client.DownloadFile(objectRel(object), savePath, 1048576)
return
}
func (o *OSS) GetInfo(object string) (info File, err error) {
// https://help.aliyun.com/document_detail/31859.html?spm=a2c4g.11186623.2.10.713d1592IKig7s#concept-lkf-swy-5db
//Cache-Control 指定该 Object 被下载时的网页的缓存行为
//Content-Disposition 指定该 Object 被下载时的名称
//Content-Encoding 指定该 Object 被下载时的内容编码格式
//Content-Language 指定该 Object 被下载时的内容语言编码
//Expires 过期时间
//Content-Length 该 Object 大小
//Content-Type 该 Object 文件类型
//Last-Modified 最近修改时间
var header http.Header
path := objectRel(object)
header, err = o.Client.GetObjectMeta(path)
if err != nil {
return
}
headerMap := make(map[string]string)
for k, _ := range header {
headerMap[k] = header.Get(k)
}
info.Header = headerMap
info.Size, _ = strconv.ParseInt(header.Get("Content-Length"), 10, 64)
info.ModTime, _ = time.Parse(http.TimeFormat, header.Get("Last-Modified"))
info.Name = path
info.IsDir = false
return
}
func (o *OSS) Lists(prefix string) (files []File, err error) {
prefix = objectRel(prefix)
var res oss.ListObjectsResult
res, err = o.Client.ListObjects(oss.Prefix(prefix))
if err != nil {
return
}
for _, object := range res.Objects {
files = append(files, File{
ModTime: object.LastModified,
Name: object.Key,
Size: object.Size,
IsDir: object.Size == 0,
Header: map[string]string{},
})
}
return
}