mirror of
https://github.com/vbatts/imgsrv.git
synced 2025-02-10 12:13:32 +00:00
multipart form! it actually uploads now.
This commit is contained in:
parent
683b4465e1
commit
8c7adeb56c
3 changed files with 91 additions and 36 deletions
|
@ -39,7 +39,7 @@ var listTemplateHTML = `
|
||||||
{{if .}}
|
{{if .}}
|
||||||
<ul>
|
<ul>
|
||||||
{{range .}}
|
{{range .}}
|
||||||
<li><a href="/f/{{.Filename}}">{{.Filename}}</a> - {{.Md5}}</li>
|
<li><a href="/f/{{.Filename}}">{{.Filename}}</a> [md5: <a href="/md5/{{.Md5}}">{{.Md5}}</a>]</li>
|
||||||
{{end}}
|
{{end}}
|
||||||
{{end}}
|
{{end}}
|
||||||
</ul>
|
</ul>
|
||||||
|
|
124
server.go
124
server.go
|
@ -153,23 +153,22 @@ func routeFilesPOST(w http.ResponseWriter, r *http.Request) {
|
||||||
info := Info{
|
info := Info{
|
||||||
Ip: r.RemoteAddr,
|
Ip: r.RemoteAddr,
|
||||||
Random: Rand64(),
|
Random: Rand64(),
|
||||||
|
TimeStamp: time.Now(),
|
||||||
}
|
}
|
||||||
|
|
||||||
if (len(uriChunks) == 2 && len(uriChunks[1]) != 0) {
|
filename = r.FormValue("filename")
|
||||||
|
if (len(filename) == 0 && len(uriChunks) == 2 && len(uriChunks[1]) != 0) {
|
||||||
filename = uriChunks[1]
|
filename = uriChunks[1]
|
||||||
}
|
}
|
||||||
if (len(filename) == 0) {
|
log.Printf("%s\n", filename)
|
||||||
filename = r.FormValue("filename")
|
|
||||||
log.Printf("%s", filename)
|
|
||||||
}
|
|
||||||
|
|
||||||
p_ext := r.FormValue("ext")
|
var p_ext string
|
||||||
log.Printf("%t", p_ext)
|
p_ext = r.FormValue("ext")
|
||||||
if (len(filename) > 0 && len(p_ext) == 0) {
|
if (len(filename) > 0 && len(p_ext) == 0) {
|
||||||
p_ext = filepath.Ext(filename)
|
p_ext = filepath.Ext(filename)
|
||||||
}// else if (len(p_ext) > 0 && p_ext[0] != ".") {
|
} else if (len(p_ext) > 0 && strings.HasPrefix(p_ext, ".")) {
|
||||||
//p_ext = fmt.Sprintf(".%s", p_ext)
|
p_ext = fmt.Sprintf(".%s", p_ext)
|
||||||
//}
|
}
|
||||||
|
|
||||||
for _, word := range []string{
|
for _, word := range []string{
|
||||||
"k", "key", "keyword",
|
"k", "key", "keyword",
|
||||||
|
@ -193,6 +192,8 @@ func routeFilesPOST(w http.ResponseWriter, r *http.Request) {
|
||||||
filename = fmt.Sprintf("%s%s", str, p_ext)
|
filename = fmt.Sprintf("%s%s", str, p_ext)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
log.Printf("%q\n", filename)
|
||||||
|
log.Printf("%t\n", p_ext)
|
||||||
|
|
||||||
exists, err := HasFileByFilename(filename)
|
exists, err := HasFileByFilename(filename)
|
||||||
if (err == nil && !exists) {
|
if (err == nil && !exists) {
|
||||||
|
@ -219,29 +220,32 @@ func routeFilesPOST(w http.ResponseWriter, r *http.Request) {
|
||||||
n)
|
n)
|
||||||
}
|
}
|
||||||
} else if (exists) {
|
} else if (exists) {
|
||||||
log.Printf("[%s] already exists", filename)
|
if (r.Method == "PUT") {
|
||||||
file, err := gfs.Open(filename)
|
// TODO nothing will get here presently. Workflow needs more review
|
||||||
defer file.Close()
|
file, err := gfs.Open(filename)
|
||||||
if (err != nil) {
|
defer file.Close()
|
||||||
serverErr(w,r,err)
|
if (err != nil) {
|
||||||
return
|
serverErr(w,r,err)
|
||||||
}
|
return
|
||||||
|
}
|
||||||
|
|
||||||
var mInfo Info
|
var mInfo Info
|
||||||
err = file.GetMeta(&mInfo)
|
err = file.GetMeta(&mInfo)
|
||||||
if (err != nil) {
|
if (err != nil) {
|
||||||
log.Printf("ERROR: failed to get metadata for %s. %s\n", filename, err)
|
log.Printf("ERROR: failed to get metadata for %s. %s\n", filename, err)
|
||||||
|
}
|
||||||
|
mInfo.Keywords = append(mInfo.Keywords, info.Keywords...)
|
||||||
|
file.SetMeta(&mInfo)
|
||||||
|
} else {
|
||||||
|
log.Printf("[%s] already exists", filename)
|
||||||
}
|
}
|
||||||
mInfo.Keywords = append(mInfo.Keywords, info.Keywords...)
|
|
||||||
file.SetMeta(&mInfo)
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
serverErr(w,r,err)
|
serverErr(w,r,err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
io.WriteString(w,
|
io.WriteString(w,
|
||||||
fmt.Sprintf("%s%s/f/%s\n", r.URL.Scheme, r.URL.Host, filename))
|
fmt.Sprintf("<a href=\"/f/%s\">/f/%s</a>\n", filename, filename))
|
||||||
|
|
||||||
LogRequest(r,200)
|
LogRequest(r,200)
|
||||||
}
|
}
|
||||||
|
@ -308,7 +312,7 @@ 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()
|
||||||
var files []File
|
var files []File
|
||||||
err := gfs.Find(nil).Sort("-uploadDate").Limit(10).All(&files)
|
err := gfs.Find(nil).Sort("-metadata.timestamp").Limit(40).All(&files)
|
||||||
if (err != nil) {
|
if (err != nil) {
|
||||||
serverErr(w,r,err)
|
serverErr(w,r,err)
|
||||||
return
|
return
|
||||||
|
@ -420,20 +424,70 @@ func routeIPs(w http.ResponseWriter, r *http.Request) {
|
||||||
|
|
||||||
func routeUpload(w http.ResponseWriter, r *http.Request) {
|
func routeUpload(w http.ResponseWriter, r *http.Request) {
|
||||||
if (r.Method == "POST") {
|
if (r.Method == "POST") {
|
||||||
// handle the form posting to this route
|
info := Info{
|
||||||
routeFilesPOST(w,r)
|
Ip: r.RemoteAddr,
|
||||||
return
|
Random: Rand64(),
|
||||||
}
|
}
|
||||||
|
|
||||||
if (r.Method != "GET") {
|
// handle the form posting to this route
|
||||||
|
r.ParseMultipartForm(1024*5)
|
||||||
|
log.Printf("%q", r.MultipartForm.Value)
|
||||||
|
for k, v := range r.MultipartForm.Value {
|
||||||
|
if (k == "keywords") {
|
||||||
|
info.Keywords = append(info.Keywords, strings.Split(v[0],",")...)
|
||||||
|
} else {
|
||||||
|
log.Printf("WARN: not sure what to do with param [%s = %s]", k,v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
filehdr := r.MultipartForm.File["filename"][0]
|
||||||
|
exists, err := HasFileByFilename(filehdr.Filename)
|
||||||
|
if (err != nil) {
|
||||||
|
serverErr(w,r,err)
|
||||||
|
return
|
||||||
|
} else if (err == nil && !exists) {
|
||||||
|
file, err := gfs.Create(filehdr.Filename)
|
||||||
|
defer file.Close()
|
||||||
|
if (err != nil) {
|
||||||
|
serverErr(w,r,err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
file.SetMeta(&info)
|
||||||
|
|
||||||
|
multiFile, err := filehdr.Open()
|
||||||
|
if (err != nil) {
|
||||||
|
log.Println(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
n, err := io.Copy(file, multiFile)
|
||||||
|
if (err != nil) {
|
||||||
|
serverErr(w,r,err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (n != r.ContentLength) {
|
||||||
|
log.Printf("WARNING: [%s] content-length (%d), content written (%d)",
|
||||||
|
filehdr.Filename,
|
||||||
|
r.ContentLength,
|
||||||
|
n)
|
||||||
|
}
|
||||||
|
|
||||||
|
io.WriteString(w,
|
||||||
|
fmt.Sprintf("<a href=\"/f/%s\">/f/%s</a>\n", filehdr.Filename, filehdr.Filename))
|
||||||
|
} else if (exists) {
|
||||||
|
// print some message about the file already existing
|
||||||
|
} else {
|
||||||
|
serverErr(w,r,err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
} else if (r.Method == "GET") {
|
||||||
|
// Show the upload form
|
||||||
|
UploadPage(w)
|
||||||
|
} else {
|
||||||
LogRequest(r,404)
|
LogRequest(r,404)
|
||||||
http.NotFound(w,r)
|
http.NotFound(w,r)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
LogRequest(r,200) // if we make it this far, then log success
|
||||||
// Show the upload form
|
|
||||||
UploadPage(w)
|
|
||||||
LogRequest(r,200)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func initMongo() {
|
func initMongo() {
|
||||||
|
|
1
types.go
1
types.go
|
@ -6,6 +6,7 @@ type Info struct {
|
||||||
Keywords []string // tags
|
Keywords []string // tags
|
||||||
Ip string // who uploaded it
|
Ip string // who uploaded it
|
||||||
Random int64
|
Random int64
|
||||||
|
TimeStamp time.Time "timestamp,omitempty"
|
||||||
}
|
}
|
||||||
|
|
||||||
type File struct {
|
type File struct {
|
||||||
|
|
Loading…
Reference in a new issue