forked from GoesToEleven/GolangTraining
/
routes.go
executable file
·95 lines (79 loc) · 1.87 KB
/
routes.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
package filebrowser
import (
"html/template"
"net/http"
"strings"
"google.golang.org/appengine"
)
var tpls *template.Template
func init() {
tpls = template.Must(template.ParseGlob("templates/*.html"))
http.HandleFunc("/", index)
http.HandleFunc("/browse/", browse)
}
func index(res http.ResponseWriter, req *http.Request) {
if req.URL.Path != "/" {
http.NotFound(res, req)
return
}
ctx := appengine.NewContext(req)
// get session
session := getSession(ctx, req)
// update session
if req.Method == "POST" {
session.Bucket = req.FormValue("bucket")
session.Credentials = req.FormValue("credentials")
putSession(ctx, res, session)
// redirect to browse
http.Redirect(res, req, "/browse/", 302)
return
}
err := tpls.ExecuteTemplate(res, "index.html", nil)
if err != nil {
http.Error(res, err.Error(), 500)
}
}
type browseModel struct {
Bucket string
Folder string
Files []string
SubFolders []string
}
func browse(res http.ResponseWriter, req *http.Request) {
ctx := appengine.NewContext(req)
session := getSession(ctx, req)
// if no bucket has been chosen
if session.Bucket == "" {
http.Redirect(res, req, "/", 302)
return
}
folder := strings.SplitN(req.URL.Path, "/", 3)[2]
if req.Method == "POST" {
file, hdr, err := req.FormFile("file")
if err != nil {
http.Error(res, err.Error(), 500)
return
}
err = putFile(ctx, session.Bucket, folder+hdr.Filename, file)
if err != nil {
http.Error(res, err.Error(), 500)
return
}
}
// list the bucket
files, subfolders, err := listBucket(ctx, session.Bucket, folder)
if err != nil {
http.Error(res, err.Error(), 500)
return
}
model := &browseModel{
Bucket: session.Bucket,
Folder: folder,
Files: files,
SubFolders: subfolders,
}
err = tpls.ExecuteTemplate(res, "browse.html", model)
if err != nil {
http.Error(res, err.Error(), 500)
}
}