1
0
Fork 0
mirror of https://github.com/vbatts/imgsrv.git synced 2024-11-27 10:35:41 +00:00

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 package main
import ( import (
"math/rand"
"labix.org/v2/mgo/bson" "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) { 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) err = gfs.Find(bson.M{"random": bson.M{"$gt" : r } }).One(&this_file)
if (err != nil) { if (err != nil) {
return this_file, err 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 package main
import ( import (
"math/rand"
"crypto/md5" "crypto/md5"
"fmt" "fmt"
"hash/adler32" "hash/adler32"
@ -8,6 +9,10 @@ import (
"time" "time"
) )
func Rand64() int64 {
return rand.Int63()
}
/* Convinience method for getting md5 sum of a string */ /* Convinience method for getting md5 sum of a string */
func GetMd5FromString(blob string) (sum []byte) { func GetMd5FromString(blob string) (sum []byte) {
h := md5.New() h := md5.New()

View file

@ -15,7 +15,6 @@ import (
"net/url" "net/url"
"os" "os"
"path/filepath" "path/filepath"
"time"
) )
var ( var (
@ -48,22 +47,6 @@ var (
FileKeywords = "" 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() { func main() {
flag.Parse() flag.Parse()
for _, arg := range flag.Args() { for _, arg := range flag.Args() {

View file

@ -5,21 +5,76 @@ import (
"io" "io"
) )
var index = ` var emptyInterface interface{}
var headTemplate = template.Must(template.New("head").Parse(headTemplateHTML))
var headTemplateHTML = `
<html> <html>
<head> <head>
<title>{{.title}}</title>
</head> </head>
<body> <body>
`
var tailTemplate = template.Must(template.New("tail").Parse(tailTemplateHTML))
var tailTemplateHTML = `
{{if .}}
<footer>{{.footer}}</footer>
{{end}}
</body> </body>
</html> </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) { if (err != nil) {
return err 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"
"labix.org/v2/mgo/bson" "labix.org/v2/mgo/bson"
"log" "log"
"math/rand"
"mime" "mime"
"net/http" "net/http"
"path/filepath" "path/filepath"
@ -153,29 +152,35 @@ func routeFilesPOST(w http.ResponseWriter, r *http.Request) {
var filename string var filename string
info := Info{ info := Info{
Ip: r.RemoteAddr, Ip: r.RemoteAddr,
Random: rand.Int63(), Random: Rand64(),
} }
if (len(uriChunks) == 2 && len(uriChunks[1]) != 0) { if (len(uriChunks) == 2 && len(uriChunks[1]) != 0) {
filename = uriChunks[1] filename = uriChunks[1]
} }
params := parseRawQuery(r.URL.RawQuery) if (len(filename) == 0) {
var p_ext string filename = r.FormValue("filename")
for k,v := range params { log.Printf("%s", filename)
switch { }
case (k == "filename"):
filename = v p_ext := r.FormValue("ext")
case (k == "ext"): log.Printf("%t", p_ext)
if (v[0] != '.') { if (len(filename) > 0 && len(p_ext) == 0) {
p_ext = fmt.Sprintf(".%s", v) 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 { } else {
p_ext = v info.Keywords = append(info.Keywords, 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)
} }
} }
} }
@ -192,24 +197,44 @@ func routeFilesPOST(w http.ResponseWriter, r *http.Request) {
exists, err := HasFileByFilename(filename) exists, err := HasFileByFilename(filename)
if (err == nil && !exists) { if (err == nil && !exists) {
file, err := gfs.Create(filename) file, err := gfs.Create(filename)
defer file.Close()
if (err != nil) { if (err != nil) {
serverErr(w,r,err) serverErr(w,r,err)
return return
} }
file.SetMeta(&info)
// copy the request body into the gfs file
n, err := io.Copy(file, r.Body) n, err := io.Copy(file, r.Body)
if (err != nil) { if (err != nil) {
serverErr(w,r,err) serverErr(w,r,err)
return return
} }
if (n != r.ContentLength) { if (n != r.ContentLength) {
log.Printf("WARNING: [%s] content-length (%d), content written (%d)", log.Printf("WARNING: [%s] content-length (%d), content written (%d)",
filename, filename,
r.ContentLength, r.ContentLength,
n) n)
} }
file.Close()
} else if (exists) { } else if (exists) {
log.Printf("[%s] already exists", filename) 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 { } else {
serverErr(w,r,err) serverErr(w,r,err)
return return
@ -282,8 +307,13 @@ func routeRoot(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "text/html") 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(bson.M{"uploadDate": bson.M{"$gt": time.Now().Add(-time.Hour)}}).Limit(10).Iter()
iter := gfs.Find(nil).Sort("-uploadDate").Limit(10).Iter() var files []File
writeList(w, iter) err := gfs.Find(nil).Sort("-uploadDate").Limit(10).All(&files)
if (err != nil) {
serverErr(w,r,err)
return
}
ListFilesPage(w,files)
LogRequest(r,200) LogRequest(r,200)
} }
@ -297,8 +327,13 @@ func routeAll(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "text/html") w.Header().Set("Content-Type", "text/html")
// Show a page of all the images // Show a page of all the images
iter := gfs.Find(nil).Iter() var files []File
writeList(w, iter) err := gfs.Find(nil).All(&files)
if (err != nil) {
serverErr(w,r,err)
return
}
ListFilesPage(w,files)
LogRequest(r,200) LogRequest(r,200)
} }
@ -338,7 +373,13 @@ func routeKeywords(w http.ResponseWriter, r *http.Request) {
return 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) LogRequest(r,200)
} }
@ -377,6 +418,24 @@ func routeIPs(w http.ResponseWriter, r *http.Request) {
LogRequest(r,200) 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() { func initMongo() {
mongo_session, err := mgo.Dial(MongoHost) mongo_session, err := mgo.Dial(MongoHost)
if err != nil { if err != nil {
@ -400,6 +459,7 @@ func runServer(ip, port string) {
defer mongo_session.Close() defer mongo_session.Close()
http.HandleFunc("/", routeRoot) http.HandleFunc("/", routeRoot)
http.HandleFunc("/upload", routeUpload)
http.HandleFunc("/all", routeAll) http.HandleFunc("/all", routeAll)
http.HandleFunc("/f/", routeFiles) http.HandleFunc("/f/", routeFiles)
http.HandleFunc("/k/", routeKeywords) 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"
}