-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfileHandling.go
146 lines (127 loc) · 3.27 KB
/
fileHandling.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
package main
import (
"errors"
"fmt"
"io/ioutil"
"os"
"path/filepath"
"github.com/olekukonko/tablewriter"
)
func attach(id uint, filename string) (uint, error) {
db := getDB()
defer db.Close()
exception := &Exception{}
db.First(&exception, id)
if exception.ID == 0 {
fmt.Println("No record of that exception.")
return 0, errors.New("No record of that exception.")
}
basename := filepath.Base(filename)
b, err := ioutil.ReadFile(filename)
if err != nil {
panic(err)
}
formFile := &FormFile{}
formFile.FileContents = b
formFile.FileName = basename
formFile.ExceptionID = id
db.Save(&formFile)
return formFile.ID, nil
}
func getFilesForException(id uint) ([]FormFile, error) {
db := getDB()
defer db.Close()
exception := &Exception{}
db.First(&exception, id)
if exception.ID == 0 {
return nil, errors.New("No record of that exception.")
}
formFiles := &[]FormFile{}
db.Model(&exception).Related(&formFiles)
return *formFiles, nil
}
func listFilesForException(id uint) {
files, err := getFilesForException(id)
if err != nil {
fmt.Printf("Could not get files for exception %d: %s\n", id, err)
return
}
if len(files) == 0 {
fmt.Printf("No files for exception %d.\n", id)
return
}
table := tablewriter.NewWriter(os.Stdout)
table.SetHeader([]string{"ID", "Created On", "Filename", "Size"})
table.SetBorder(false)
for _, file := range files {
table.Append([]string{fmt.Sprintf("%d", file.ID),
stringFromDate(&file.CreatedAt),
file.FileName,
fmt.Sprintf("%d", len(file.FileContents)),
})
}
table.Render()
return
}
// This is for when you want to download a single file and have
// referred to it directly by ID
func downloadOneFile(fileID uint) {
db := getDB()
defer db.Close()
file := &FormFile{}
db.First(&file, fileID)
if file.ID == 0 {
fmt.Println("No record of that file.")
return
}
targetFilename := file.FileName
// This is a while loop in any other language
for fileExists(targetFilename) {
targetFilename += "_"
}
err := writeOutFile(*file, targetFilename)
if err != nil {
fmt.Println("Could not write out file to ", targetFilename, ": ", err)
return
}
fmt.Printf("Wrote out file %d to: %s\n", fileID, targetFilename)
return
}
// This is for when you want all the files for an exception and
// have referred to the *exception* by ID, not the file
func downloadFilesForException(exceptionID uint) {
files, err := getFilesForException(exceptionID)
if err != nil {
fmt.Println(err)
return
}
for _, file := range files {
targetFilename := file.FileName
// This is a while loop in any other language
for fileExists(targetFilename) {
targetFilename += "_"
}
err := writeOutFile(file, targetFilename)
if err != nil {
fmt.Println("Could not write out file to ", targetFilename, ": ", err)
return
}
fmt.Printf("Wrote out file %d to: %s\n", file.ID, targetFilename)
}
return
}
func fileExists(filename string) bool {
// For checking you're not overwriting a file first
_, err := os.Stat(filename)
if err == nil {
return true
}
if os.IsNotExist(err) {
return false
}
panic(err)
}
func writeOutFile(file FormFile, targetFilename string) error {
//ioutil.WriteFile(filename string, data []byte, perm os.FileMode) error
return ioutil.WriteFile(targetFilename, file.FileContents, os.FileMode(0500))
}