package frontend import ( "fmt" "log" "net/http" "path/filepath" "strings" "github.com/google/uuid" b "streifling.com/jason/cpolis/cmd/backend" ) func UploadPDF(c *b.Config, s map[string]*Session) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { if _, err := ManageSession(w, r, c, s); err != nil { http.Error(w, "Die Session ist abgelaufen. Bitte erneut anmelden.", http.StatusUnauthorized) return } file, header, err := r.FormFile("pdf-upload") if err != nil { log.Println(err) http.Error(w, err.Error(), http.StatusInternalServerError) return } defer file.Close() buffer := make([]byte, 512) // Should be enough for mime type if _, err := file.Read(buffer); err != nil { log.Println(err) http.Error(w, err.Error(), http.StatusInternalServerError) return } if _, err := file.Seek(0, 0); err != nil { log.Println(err) http.Error(w, err.Error(), http.StatusInternalServerError) return } if http.DetectContentType(buffer) != "application/pdf" { http.Error(w, "Die Datei ist kein PDF.", http.StatusBadRequest) return } oldFilename := header.Filename oldFilename = strings.Join(strings.Split(oldFilename, ".")[:len(oldFilename)-1], ".") filename := fmt.Sprint(oldFilename, ".", uuid.New(), ".pdf") absFilepath, err := filepath.Abs(c.PDFDir + "/" + filename) if err != nil { log.Println(err) http.Error(w, err.Error(), http.StatusInternalServerError) return } if err = b.WriteFile(absFilepath, file); err != nil { log.Println(err) http.Error(w, err.Error(), http.StatusInternalServerError) return } w.WriteHeader(http.StatusOK) } }