add timestamp to filename support with force name function

This commit is contained in:
Simon Rieger 2024-04-01 11:25:49 +02:00
parent 4b8954d540
commit 40ea8d95df
2 changed files with 102 additions and 89 deletions

View file

@ -54,109 +54,118 @@ func homeHandler(w http.ResponseWriter, r *http.Request) {
} }
func uploadHandler(w http.ResponseWriter, r *http.Request) { func uploadHandler(w http.ResponseWriter, r *http.Request) {
// Setzen der Content Security Policy // Setzen der Content Security Policy
w.Header().Set("Content-Security-Policy", "default-src 'self'; script-src 'self'; object-src 'none';") w.Header().Set("Content-Security-Policy", "default-src 'self'; script-src 'self'; object-src 'none';")
mu.Lock() mu.Lock()
defer mu.Unlock() defer mu.Unlock()
if time.Since(lastUploadTime) < uploadInterval { if time.Since(lastUploadTime) < uploadInterval {
http.Error(w, "Nur alle 10 Sekunden erlaubt", http.StatusTooManyRequests) http.Error(w, "Nur alle 10 Sekunden erlaubt", http.StatusTooManyRequests)
log.Printf("Bildupload zu häufig. Nur alle 10 Sekunden erlaubt.") log.Printf("Bildupload zu häufig. Nur alle 10 Sekunden erlaubt.")
return return
} }
if r.Method == http.MethodPost { if r.Method == http.MethodPost {
file, handler, err := r.FormFile("image") file, handler, err := r.FormFile("image")
if err != nil { if err != nil {
http.Error(w, "Fehler beim Lesen der Datei", http.StatusInternalServerError) http.Error(w, "Fehler beim Lesen der Datei", http.StatusInternalServerError)
log.Printf("Fehler beim Lesen der Datei: %v", err) log.Printf("Fehler beim Lesen der Datei: %v", err)
return return
} }
defer file.Close() defer file.Close()
// Überprüfen Sie den MIME-Typ der Datei // Überprüfen Sie den MIME-Typ der Datei
buffer := make([]byte, 512) // Genug für die Erkennung des MIME-Typs buffer := make([]byte, 512) // Genug für die Erkennung des MIME-Typs
_, err = file.Read(buffer) _, err = file.Read(buffer)
if err != nil { if err != nil {
http.Error(w, "Fehler beim Lesen der Datei", http.StatusInternalServerError) http.Error(w, "Fehler beim Lesen der Datei", http.StatusInternalServerError)
log.Printf("Fehler beim Lesen der Datei für MIME-Typ-Erkennung: %v", err) log.Printf("Fehler beim Lesen der Datei für MIME-Typ-Erkennung: %v", err)
return return
} }
mimeType := http.DetectContentType(buffer) mimeType := http.DetectContentType(buffer)
if !strings.HasPrefix(mimeType, "image/") && !strings.HasPrefix(mimeType, "text/xml") && !strings.HasPrefix(mimeType, "image/svg+xml") { if !strings.HasPrefix(mimeType, "image/") && !strings.HasPrefix(mimeType, "text/xml") && !strings.HasPrefix(mimeType, "image/svg+xml") {
http.Error(w, "Nur Bild-Uploads sind erlaubt", http.StatusBadRequest) http.Error(w, "Nur Bild-Uploads sind erlaubt", http.StatusBadRequest)
log.Printf("Versuch, eine Nicht-Bild-Datei hochzuladen: %v", mimeType) log.Printf("Versuch, eine Nicht-Bild-Datei hochzuladen: %v", mimeType)
return return
} }
// Zurücksetzen des Dateizeigers, um die Datei vollständig zu kopieren _, err = file.Seek(0, io.SeekStart)
_, err = file.Seek(0, io.SeekStart) if err != nil {
if err != nil { http.Error(w, "Fehler beim Zurücksetzen des Dateizeigers", http.StatusInternalServerError)
http.Error(w, "Fehler beim Zurücksetzen des Dateizeigers", http.StatusInternalServerError) log.Printf("Fehler beim Zurücksetzen des Dateizeigers: %v", err)
log.Printf("Fehler beim Zurücksetzen des Dateizeigers: %v", err) return
return }
}
// Hier können Sie den Dateinamen manipulieren oder einen anderen Speicherort wählen // Ermitteln, ob der ursprüngliche Dateiname erzwungen werden soll
uploadPath := "./uploads/" + handler.Filename //forceName := r.Header.Get("Force-Name")
f, err := os.Create(uploadPath) forceName := r.FormValue("force_name")
if err != nil { var filename string
http.Error(w, "Fehler beim Erstellen der Datei", http.StatusInternalServerError) if forceName == "true" {
log.Printf("Fehler beim Erstellen der Datei: %v", err) filename = handler.Filename
return } else {
} // Zeitstempel zum Dateinamen hinzufügen
defer f.Close() timestamp := time.Now().Format("20060102-150405")
filename = fmt.Sprintf("%s-%s", timestamp, handler.Filename)
}
_, copyErr := io.Copy(f, file) // Datei speichern
if copyErr != nil { uploadPath := "./uploads/" + filename
http.Error(w, "Fehler beim Kopieren der Datei", http.StatusInternalServerError) f, err := os.Create(uploadPath)
log.Printf("Fehler beim Kopieren der Datei: %v", copyErr) if err != nil {
return http.Error(w, "Fehler beim Erstellen der Datei", http.StatusInternalServerError)
} log.Printf("Fehler beim Erstellen der Datei: %v", err)
return
}
defer f.Close()
lastUploadTime = time.Now() // Setzen Sie die Zeit des letzten Uploads _, copyErr := io.Copy(f, file)
if copyErr != nil {
http.Error(w, "Fehler beim Kopieren der Datei", http.StatusInternalServerError)
log.Printf("Fehler beim Kopieren der Datei: %v", copyErr)
return
}
// Nach erfolgreichem Upload: lastUploadTime = time.Now() // Setzen Sie die Zeit des letzten Uploads
tmpl, err := template.ParseFiles("templates/uploadSuccess.html")
if err != nil {
http.Error(w, "Fehler beim Laden des Templates", http.StatusInternalServerError)
log.Printf("Fehler beim Laden des Templates: %v", err)
return
}
data := struct { tmpl, err := template.ParseFiles("templates/uploadSuccess.html")
Message string if err != nil {
Filename string http.Error(w, "Fehler beim Laden des Templates", http.StatusInternalServerError)
}{ log.Printf("Fehler beim Laden des Templates: %v", err)
Message: "Bild erfolgreich hochgeladen.", return
Filename: handler.Filename, }
}
err = tmpl.Execute(w, data) data := struct {
if err != nil { Message string
http.Error(w, "Fehler beim Rendern des Templates", http.StatusInternalServerError) Filename string
log.Printf("Fehler beim Rendern des Templates: %v", err) }{
return Message: "Bild erfolgreich hochgeladen.",
} Filename: filename, // Geändert, um den möglicherweise modifizierten Dateinamen anzuzeigen
}
} else { err = tmpl.Execute(w, data)
if err != nil {
http.Error(w, "Fehler beim Rendern des Templates", http.StatusInternalServerError)
log.Printf("Fehler beim Rendern des Templates: %v", err)
return
}
tmpl, err := template.ParseFiles("templates/uploadForm.html") } else {
if err != nil { tmpl, err := template.ParseFiles("templates/uploadForm.html")
http.Error(w, "Fehler beim Laden des Templates", http.StatusInternalServerError) if err != nil {
log.Printf("Fehler beim Laden des Templates: %v", err) http.Error(w, "Fehler beim Laden des Templates", http.StatusInternalServerError)
return log.Printf("Fehler beim Laden des Templates: %v", err)
} return
}
err = tmpl.Execute(w, nil) err = tmpl.Execute(w, nil)
if err != nil { if err != nil {
http.Error(w, "Fehler beim Rendern des Templates", http.StatusInternalServerError) http.Error(w, "Fehler beim Rendern des Templates", http.StatusInternalServerError)
log.Printf("Fehler beim Rendern des Templates: %v", err) log.Printf("Fehler beim Rendern des Templates: %v", err)
return return
} }
} }
} }
// Funktion zur Ermittlung des MIME-Types basierend auf der Dateiendung // Funktion zur Ermittlung des MIME-Types basierend auf der Dateiendung

View file

@ -5,7 +5,11 @@
</head> </head>
<body> <body>
<form action="/upload" method="post" enctype="multipart/form-data"> <form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="image"> <input type="file" name="image" required>
<br>
<input type="checkbox" name="force_name" value="true">
<label for="force_name">Originalnamen beibehalten (Force Name)</label>
<br>
<input type="submit" value="Hochladen"> <input type="submit" value="Hochladen">
</form> </form>
</body> </body>