/
file_datasource.go
92 lines (75 loc) · 1.68 KB
/
file_datasource.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
package file
import (
"fmt"
"io"
"mime/multipart"
"os"
"path/filepath"
"strings"
"github.com/google/uuid"
)
// DataSource is the interface
type DataSource interface {
SaveFile(path string, file *multipart.FileHeader) (string, error)
CreateDirectory(dirName string) bool
ExtWhitelist(path string) (string, error)
}
type dataSource struct {
}
// NewDataSource is new instance
func NewDataSource() DataSource {
return &dataSource{}
}
func (ds *dataSource) SaveFile(path string, file *multipart.FileHeader) (string, error) {
src, err := file.Open()
if err != nil {
return "", err
}
defer src.Close()
ext := filepath.Ext(file.Filename)
if _, e := ds.ExtWhitelist(ext); e != nil {
return "", e
}
uid, _ := uuid.NewUUID()
filename := fmt.Sprintf("%s%s", uid.String(), ext)
// Destination
ds.CreateDirectory(path)
pathFile := fmt.Sprintf("%s/%s", path, filename)
dst, err := os.Create(pathFile)
if err != nil {
return "", err
}
defer dst.Close()
// Copy
if _, err = io.Copy(dst, src); err != nil {
return "", err
}
return pathFile, err
}
func (ds *dataSource) CreateDirectory(dirName string) bool {
src, err := os.Stat(dirName)
if os.IsNotExist(err) {
errDir := os.MkdirAll(dirName, 0755)
if errDir != nil {
panic(err)
}
return true
}
if src.Mode().IsRegular() {
fmt.Println(dirName, "already exist as a file!")
return false
}
return false
}
func (ds *dataSource) ExtWhitelist(path string) (string, error) {
extList := os.Getenv("EXT")
exts := strings.Split(extList, ",")
if len(exts) > 0 {
for _, ext := range exts {
if filepath.Ext(path) == "."+ext {
return "." + ext, nil
}
}
}
return "", fmt.Errorf("%s", "Unsupported file")
}