-
Notifications
You must be signed in to change notification settings - Fork 1
/
upload_buffer.go
77 lines (65 loc) · 1.66 KB
/
upload_buffer.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
package storage
import (
"bytes"
"errors"
"fmt"
"io"
"strings"
s "cloud.google.com/go/storage"
oss "github.com/aliyun/aliyun-oss-go-sdk/oss"
)
// Buffer :
type Buffer struct {
adapter string // gcs and aliyun
bucket string // gcs and aliyun
filename string // gcs and aliyun
storageWriter *s.Writer // gcs
object *oss.Bucket // aliyun
endpoint string // aliyun
position int64 // aliyun
}
// Copy :
func (buf *Buffer) Copy(reader io.Reader) error {
switch buf.adapter {
case GCS:
if _, err := io.Copy(buf.storageWriter, reader); err != nil {
msg := fmt.Sprintf("Could not write file: %v", err)
return errors.New(msg)
}
case ALIYUN:
position, err := buf.object.AppendObject(buf.filename, reader, buf.position)
if err != nil {
msg := fmt.Sprintf("Could not write file: %v", err)
return errors.New(msg)
}
buf.position = position
default:
return errors.New("invalid adapter")
}
return nil
}
// CopyByte :
func (buf *Buffer) CopyByte(data []byte) error {
d := bytes.NewReader(data)
return buf.Copy(d)
}
// CopyString :
func (buf *Buffer) CopyString(data string) error {
d := strings.NewReader(data)
return buf.Copy(d)
}
// Close :
func (buf *Buffer) Close() (string, error) {
switch buf.adapter {
case GCS:
if err := buf.storageWriter.Close(); err != nil {
msg := fmt.Sprintf("Could not put file: %v", err)
return "", errors.New(msg)
}
return fmt.Sprintf("%s/%s/%s", googleGCSDomain, buf.bucket, buf.storageWriter.Name), nil
case ALIYUN:
return getAliyunFileURL(buf.endpoint, buf.bucket, buf.filename), nil
default:
return "", errors.New("invalid adapter")
}
}