103 lines
2.9 KiB
Go
103 lines
2.9 KiB
Go
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>")
|
|
}
|