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, "