diff --git a/has.go b/db_fileutil.go
similarity index 97%
rename from has.go
rename to db_fileutil.go
index f748a62..9399aae 100644
--- a/has.go
+++ b/db_fileutil.go
@@ -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
diff --git a/get.go b/get.go
deleted file mode 100644
index 38a7e92..0000000
--- a/get.go
+++ /dev/null
@@ -1,7 +0,0 @@
-package main
-
-import (
- "math/rand"
- "labix.org/v2/mgo/bson"
-)
-
diff --git a/hash.go b/hash.go
index 5ff5eb7..03c6350 100644
--- a/hash.go
+++ b/hash.go
@@ -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()
diff --git a/imgsrv.go b/imgsrv.go
index 03ce846..0821595 100644
--- a/imgsrv.go
+++ b/imgsrv.go
@@ -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() {
diff --git a/layouts.go b/layouts.go
index 5120236..1240dd7 100644
--- a/layouts.go
+++ b/layouts.go
@@ -5,21 +5,76 @@ import (
"io"
)
-var index = `
+var emptyInterface interface{}
+
+var headTemplate = template.Must(template.New("head").Parse(headTemplateHTML))
+var headTemplateHTML = `
+ {{.title}}
+`
-
+var tailTemplate = template.Must(template.New("tail").Parse(tailTemplateHTML))
+var tailTemplateHTML = `
+{{if .}}
+
+{{end}}
`
-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 = `
+
+`
+
+var listTemplate = template.Must(template.New("list").Parse(listTemplateHTML))
+var listTemplateHTML = `
+{{if .}}
+
+`
+
+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
}
diff --git a/server.go b/server.go
index 1ec663a..7f7fef1 100644
--- a/server.go
+++ b/server.go
@@ -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)
diff --git a/types.go b/types.go
new file mode 100644
index 0000000..f34efda
--- /dev/null
+++ b/types.go
@@ -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"
+}