many updates, and cleanup, but the /upload form is not quite working yet

This commit is contained in:
Vincent Batts 2013-02-11 14:27:38 -05:00
parent 3a899e1daa
commit 683b4465e1
7 changed files with 169 additions and 55 deletions

View File

@ -2,7 +2,6 @@
package main
import (
"math/rand"
"labix.org/v2/mgo/bson"
)
@ -17,7 +16,7 @@ func GetFileByFilename(filename string) (this_file File, err error) {
}
func GetFileRandom() (this_file File, err error) {
r := rand.Int63()
r := Rand64()
err = gfs.Find(bson.M{"random": bson.M{"$gt" : r } }).One(&this_file)
if (err != nil) {
return this_file, err

7
get.go
View File

@ -1,7 +0,0 @@
package main
import (
"math/rand"
"labix.org/v2/mgo/bson"
)

View File

@ -1,6 +1,7 @@
package main
import (
"math/rand"
"crypto/md5"
"fmt"
"hash/adler32"
@ -8,6 +9,10 @@ import (
"time"
)
func Rand64() int64 {
return rand.Int63()
}
/* Convinience method for getting md5 sum of a string */
func GetMd5FromString(blob string) (sum []byte) {
h := md5.New()

View File

@ -15,7 +15,6 @@ import (
"net/url"
"os"
"path/filepath"
"time"
)
var (
@ -48,22 +47,6 @@ var (
FileKeywords = ""
)
type Info struct {
Keywords []string // tags
Ip string // who uploaded it
Random int64
}
type File struct {
Metadata Info ",omitempty"
Md5 string
ChunkSize int
UploadDate time.Time
Length int64
Filename string ",omitempty"
ContentType string "contentType,omitempty"
}
func main() {
flag.Parse()
for _, arg := range flag.Args() {

View File

@ -5,21 +5,76 @@ import (
"io"
)
var index = `
var emptyInterface interface{}
var headTemplate = template.Must(template.New("head").Parse(headTemplateHTML))
var headTemplateHTML = `
<html>
<head>
<title>{{.title}}</title>
</head>
<body>
`
var tailTemplate = template.Must(template.New("tail").Parse(tailTemplateHTML))
var tailTemplateHTML = `
{{if .}}
<footer>{{.footer}}</footer>
{{end}}
</body>
</html>
`
func IndexPage(w io.Writer) (err error) {
t, err := template.New("index").Parse(index)
var formFileUploadTemplate = template.Must(template.New("formFileUpload").Parse(formFileUploadTemplateHTML))
var formFileUploadTemplateHTML = `
<form enctype="multipart/form-data" action="" method="POST">
<input type="text" name="keywords" placeholder="keywords"><br/>
<input type="file" name="filename" placeholder="filename"><br/>
<input type="submit" value="Upload File"><br/>
</form>
`
var listTemplate = template.Must(template.New("list").Parse(listTemplateHTML))
var listTemplateHTML = `
{{if .}}
<ul>
{{range .}}
<li><a href="/f/{{.Filename}}">{{.Filename}}</a> - {{.Md5}}</li>
{{end}}
{{end}}
</ul>
`
func UploadPage(w io.Writer) (err error) {
err = headTemplate.Execute(w, map[string]string{"title" : "FileSrv :: Upload"})
if (err != nil) {
return err
}
return t.Execute(w, index)
err = formFileUploadTemplate.Execute(w, &emptyInterface)
if (err != nil) {
return err
}
err = tailTemplate.Execute(w, map[string]string{})
if (err != nil) {
return err
}
return
}
func ListFilesPage(w io.Writer, files []File) (err error) {
err = headTemplate.Execute(w, map[string]string{"title" : "FileSrv"})
if (err != nil) {
return err
}
err = listTemplate.Execute(w, files)
if (err != nil) {
return err
}
//err = tailTemplate.Execute(w, map[string]string{"footer" : "herp til you derp 2013"})
err = tailTemplate.Execute(w, &emptyInterface)
if (err != nil) {
return err
}
return
}

108
server.go
View File

@ -6,7 +6,6 @@ import (
"labix.org/v2/mgo"
"labix.org/v2/mgo/bson"
"log"
"math/rand"
"mime"
"net/http"
"path/filepath"
@ -153,29 +152,35 @@ func routeFilesPOST(w http.ResponseWriter, r *http.Request) {
var filename string
info := Info{
Ip: r.RemoteAddr,
Random: rand.Int63(),
Random: Rand64(),
}
if (len(uriChunks) == 2 && len(uriChunks[1]) != 0) {
filename = uriChunks[1]
}
params := parseRawQuery(r.URL.RawQuery)
var p_ext string
for k,v := range params {
switch {
case (k == "filename"):
filename = v
case (k == "ext"):
if (v[0] != '.') {
p_ext = fmt.Sprintf(".%s", v)
if (len(filename) == 0) {
filename = r.FormValue("filename")
log.Printf("%s", filename)
}
p_ext := r.FormValue("ext")
log.Printf("%t", p_ext)
if (len(filename) > 0 && len(p_ext) == 0) {
p_ext = filepath.Ext(filename)
}// else if (len(p_ext) > 0 && p_ext[0] != ".") {
//p_ext = fmt.Sprintf(".%s", p_ext)
//}
for _, word := range []string{
"k", "key", "keyword",
"keys", "keywords",
} {
v := r.FormValue(word)
if (len(v) > 0) {
if (strings.Contains(v, ",")) {
info.Keywords = append(info.Keywords, strings.Split(v,",")...)
} else {
p_ext = v
}
case (k == "k" || k == "key" || k == "keyword"):
info.Keywords = append(info.Keywords[:], v)
case (k == "keys" || k == "keywords"):
for _, key := range strings.Split(v, ",") {
info.Keywords = append(info.Keywords[:], key)
info.Keywords = append(info.Keywords, v)
}
}
}
@ -192,24 +197,44 @@ func routeFilesPOST(w http.ResponseWriter, r *http.Request) {
exists, err := HasFileByFilename(filename)
if (err == nil && !exists) {
file, err := gfs.Create(filename)
defer file.Close()
if (err != nil) {
serverErr(w,r,err)
return
}
file.SetMeta(&info)
// copy the request body into the gfs file
n, err := io.Copy(file, r.Body)
if (err != nil) {
serverErr(w,r,err)
return
}
if (n != r.ContentLength) {
log.Printf("WARNING: [%s] content-length (%d), content written (%d)",
filename,
r.ContentLength,
n)
}
file.Close()
} else if (exists) {
log.Printf("[%s] already exists", filename)
file, err := gfs.Open(filename)
defer file.Close()
if (err != nil) {
serverErr(w,r,err)
return
}
var mInfo Info
err = file.GetMeta(&mInfo)
if (err != nil) {
log.Printf("ERROR: failed to get metadata for %s. %s\n", filename, err)
}
mInfo.Keywords = append(mInfo.Keywords, info.Keywords...)
file.SetMeta(&mInfo)
} else {
serverErr(w,r,err)
return
@ -282,8 +307,13 @@ func routeRoot(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "text/html")
//iter := gfs.Find(bson.M{"uploadDate": bson.M{"$gt": time.Now().Add(-time.Hour)}}).Limit(10).Iter()
iter := gfs.Find(nil).Sort("-uploadDate").Limit(10).Iter()
writeList(w, iter)
var files []File
err := gfs.Find(nil).Sort("-uploadDate").Limit(10).All(&files)
if (err != nil) {
serverErr(w,r,err)
return
}
ListFilesPage(w,files)
LogRequest(r,200)
}
@ -297,8 +327,13 @@ func routeAll(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "text/html")
// Show a page of all the images
iter := gfs.Find(nil).Iter()
writeList(w, iter)
var files []File
err := gfs.Find(nil).All(&files)
if (err != nil) {
serverErr(w,r,err)
return
}
ListFilesPage(w,files)
LogRequest(r,200)
}
@ -338,7 +373,13 @@ func routeKeywords(w http.ResponseWriter, r *http.Request) {
return
}
writeList(w, iter)
var files []File
err := iter.All(&files)
if (err != nil) {
serverErr(w,r,err)
return
}
ListFilesPage(w, files)
LogRequest(r,200)
}
@ -377,6 +418,24 @@ func routeIPs(w http.ResponseWriter, r *http.Request) {
LogRequest(r,200)
}
func routeUpload(w http.ResponseWriter, r *http.Request) {
if (r.Method == "POST") {
// handle the form posting to this route
routeFilesPOST(w,r)
return
}
if (r.Method != "GET") {
LogRequest(r,404)
http.NotFound(w,r)
return
}
// Show the upload form
UploadPage(w)
LogRequest(r,200)
}
func initMongo() {
mongo_session, err := mgo.Dial(MongoHost)
if err != nil {
@ -400,6 +459,7 @@ func runServer(ip, port string) {
defer mongo_session.Close()
http.HandleFunc("/", routeRoot)
http.HandleFunc("/upload", routeUpload)
http.HandleFunc("/all", routeAll)
http.HandleFunc("/f/", routeFiles)
http.HandleFunc("/k/", routeKeywords)

19
types.go Normal file
View File

@ -0,0 +1,19 @@
package main
import "time"
type Info struct {
Keywords []string // tags
Ip string // who uploaded it
Random int64
}
type File struct {
Metadata Info ",omitempty"
Md5 string
ChunkSize int
UploadDate time.Time
Length int64
Filename string ",omitempty"
ContentType string "contentType,omitempty"
}