feat: add /files/{file} GET and DELETE methods
This commit is contained in:
parent
7ca416e43e
commit
4a4a0a2149
7 changed files with 252 additions and 60 deletions
103
handlers.go
Normal file
103
handlers.go
Normal file
|
|
@ -0,0 +1,103 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"net/http"
|
||||
"os"
|
||||
"time"
|
||||
)
|
||||
|
||||
func downloadFile(w http.ResponseWriter, req *http.Request, fileName string) {
|
||||
Info.Println(fmt.Sprintf("server: will download %v", fileName))
|
||||
file, err := os.Open(fmt.Sprintf("%v/%v", SFU_FILES_DIR, fileName))
|
||||
if err != nil {
|
||||
Error.Println(err)
|
||||
http.Error(w, "File not found", http.StatusNotFound)
|
||||
return
|
||||
}
|
||||
defer file.Close()
|
||||
w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=%v", fileName))
|
||||
http.ServeContent(w, req, fileName, time.Now(), file)
|
||||
}
|
||||
|
||||
func fileExists(fileName string) bool {
|
||||
_, err := os.Stat(fmt.Sprintf("%v/%v", SFU_FILES_DIR, fileName))
|
||||
if err == nil {
|
||||
return true
|
||||
}
|
||||
if os.IsNotExist(err) {
|
||||
return false
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func deleteFile(w http.ResponseWriter, req *http.Request, fileName string) {
|
||||
Info.Println(fmt.Sprintf("server: will delete %v", fileName))
|
||||
if !fileExists(fileName) {
|
||||
Error.Println(fmt.Sprintf("%v does not exist", fileName))
|
||||
http.Error(w, "File not found", http.StatusNotFound)
|
||||
return
|
||||
}
|
||||
err := os.Remove(fmt.Sprintf("%v/%v", SFU_FILES_DIR, fileName))
|
||||
if err != nil {
|
||||
Error.Println(err)
|
||||
http.Error(w, "Internal Server Error", http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
w.WriteHeader(http.StatusOK)
|
||||
w.Write([]byte("file deleted"))
|
||||
}
|
||||
|
||||
func uploadFile(w http.ResponseWriter, req *http.Request) {
|
||||
file, fileHeader, err := req.FormFile("file")
|
||||
if err != nil {
|
||||
Error.Println(err)
|
||||
}
|
||||
defer file.Close()
|
||||
fileExists := fileExists(fileHeader.Filename)
|
||||
forceOverwrite := req.FormValue("force")
|
||||
if fileExists && forceOverwrite != "true" {
|
||||
Error.Println(fmt.Sprintf("file %v already exists", fileHeader.Filename))
|
||||
http.Error(w, "File already exists", http.StatusConflict)
|
||||
return
|
||||
}
|
||||
if !fileExists || (forceOverwrite == "true" && fileExists) {
|
||||
Info.Println(fmt.Sprintf("server: will upload %v", fileHeader.Filename))
|
||||
out, err := os.Create(fmt.Sprintf("%v/%v", SFU_FILES_DIR, fileHeader.Filename))
|
||||
if err != nil {
|
||||
Error.Println(err)
|
||||
http.Error(w, "Internal Server Error", http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
defer out.Close()
|
||||
_, err = io.Copy(out, file)
|
||||
if err != nil {
|
||||
Error.Println(err)
|
||||
http.Error(w, "Internal Server Error", http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
w.WriteHeader(http.StatusCreated)
|
||||
w.Write([]byte("file uploaded"))
|
||||
return
|
||||
}
|
||||
http.Error(w, "internal server error", http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
|
||||
func listFiles(w http.ResponseWriter, req *http.Request) {
|
||||
Info.Println(fmt.Sprintf("server: will list uploaded files on %v", SFU_FILES_DIR))
|
||||
files, err := ioutil.ReadDir(SFU_FILES_DIR)
|
||||
if err != nil {
|
||||
Warning.Println(fmt.Sprintf("%v does not exist", SFU_FILES_DIR))
|
||||
Info.Println(fmt.Sprintf("will create %v", SFU_FILES_DIR))
|
||||
_ = os.Mkdir(SFU_FILES_DIR, os.ModePerm)
|
||||
}
|
||||
fmt.Fprint(w, "<html><body><ol>")
|
||||
for _, f := range files {
|
||||
|
||||
fmt.Fprintf(w, "<li><a href=\"%v\">%v</a></li>\n", f.Name(), f.Name())
|
||||
}
|
||||
fmt.Fprint(w, "</ol></body></html>")
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue