add html-templates

This commit is contained in:
Simon Rieger 2024-03-08 14:59:31 +01:00
parent beed73ed1a
commit f3432ce106
5 changed files with 116 additions and 17 deletions

View file

@ -18,6 +18,7 @@ services:
volumes: volumes:
- ./uploads:/uploads - ./uploads:/uploads
- ./templates:/templates
restart: always restart: always

View file

@ -2,11 +2,12 @@ package main
import ( import (
"fmt" "fmt"
_ "html/template" "html/template"
"io" "io"
"log" "log"
"net/http" "net/http"
"os" "os"
"strings"
"sync" "sync"
"time" "time"
) )
@ -27,9 +28,26 @@ func main() {
} }
func homeHandler(w http.ResponseWriter, r *http.Request) { func homeHandler(w http.ResponseWriter, r *http.Request) {
// Hier können Sie eine HTML-Templatedatei für die Homepage erstellen // Setzen der Content Security Policy
// und sie mit template.Execute laden. w.Header().Set("Content-Security-Policy", "default-src 'self'; script-src 'self'; object-src 'none';")
fmt.Fprint(w, "Willkommen! Besuchen Sie /upload, um Bilder hochzuladen.")
// Verwenden von html/template zur sicheren Ausgabe von HTML
tmpl, err := template.ParseFiles("templates/homeTemplate.html")
if err != nil {
http.Error(w, "Fehler beim Laden des Templates", http.StatusInternalServerError)
return
}
data := struct {
Title string
}{
Title: "Bildupload",
}
err = tmpl.Execute(w, data)
if err != nil {
http.Error(w, "Fehler beim Rendern des Templates", http.StatusInternalServerError)
}
} }
func uploadHandler(w http.ResponseWriter, r *http.Request) { func uploadHandler(w http.ResponseWriter, r *http.Request) {
@ -51,6 +69,30 @@ func uploadHandler(w http.ResponseWriter, r *http.Request) {
} }
defer file.Close() defer file.Close()
// Überprüfen Sie den MIME-Typ der Datei
buffer := make([]byte, 512) // Genug für die Erkennung des MIME-Typs
_, err = file.Read(buffer)
if err != nil {
http.Error(w, "Fehler beim Lesen der Datei", http.StatusInternalServerError)
log.Printf("Fehler beim Lesen der Datei für MIME-Typ-Erkennung: %v", err)
return
}
mimeType := http.DetectContentType(buffer)
if !strings.HasPrefix(mimeType, "image/") {
http.Error(w, "Nur Bild-Uploads sind erlaubt", http.StatusBadRequest)
log.Printf("Versuch, eine Nicht-Bild-Datei hochzuladen: %v", mimeType)
return
}
// Zurücksetzen des Dateizeigers, um die Datei vollständig zu kopieren
_, err = file.Seek(0, io.SeekStart)
if err != nil {
http.Error(w, "Fehler beim Zurücksetzen des Dateizeigers", http.StatusInternalServerError)
log.Printf("Fehler beim Zurücksetzen des Dateizeigers: %v", err)
return
}
// Hier können Sie den Dateinamen manipulieren oder einen anderen Speicherort wählen // Hier können Sie den Dateinamen manipulieren oder einen anderen Speicherort wählen
uploadPath := "./uploads/" + handler.Filename uploadPath := "./uploads/" + handler.Filename
f, err := os.Create(uploadPath) f, err := os.Create(uploadPath)
@ -70,21 +112,44 @@ func uploadHandler(w http.ResponseWriter, r *http.Request) {
lastUploadTime = time.Now() // Setzen Sie die Zeit des letzten Uploads lastUploadTime = time.Now() // Setzen Sie die Zeit des letzten Uploads
// Erfolgsmeldung mit dem Link ausgeben // Nach erfolgreichem Upload:
link := fmt.Sprintf("Bild erfolgreich hochgeladen. Sie können es hier anzeigen: <a href='/view/%s'>Anzeigen</a>", handler.Filename) 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 {
Message string
Filename string
}{
Message: "Bild erfolgreich hochgeladen.",
Filename: handler.Filename,
}
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
}
// Schreiben Sie den Link als HTML in die Antwort
w.Header().Set("Content-Type", "text/html; charset=utf-8")
fmt.Fprint(w, link)
} else { } else {
// HTML-Formular für Bild-Upload hier anzeigen
form := `<html><body> tmpl, err := template.ParseFiles("templates/uploadForm.html")
<form action="/upload" method="post" enctype="multipart/form-data"> if err != nil {
<input type="file" name="image"> http.Error(w, "Fehler beim Laden des Templates", http.StatusInternalServerError)
<input type="submit" value="Hochladen"> log.Printf("Fehler beim Laden des Templates: %v", err)
</form> return
</body></html>` }
fmt.Fprint(w, form)
err = tmpl.Execute(w, nil)
if err != nil {
http.Error(w, "Fehler beim Rendern des Templates", http.StatusInternalServerError)
log.Printf("Fehler beim Rendern des Templates: %v", err)
return
}
} }
} }

View file

@ -0,0 +1,11 @@
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<title>{{.Title}}</title>
</head>
<body>
<h1>{{.Title}}</h1>
<p>Besuchen Sie /upload, um Bilder hochzuladen.</p>
</body>
</html>

12
templates/uploadForm.html Normal file
View file

@ -0,0 +1,12 @@
<!DOCTYPE html>
<html>
<head>
<title>Bild hochladen</title>
</head>
<body>
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="image">
<input type="submit" value="Hochladen">
</form>
</body>
</html>

View file

@ -0,0 +1,10 @@
<!DOCTYPE html>
<html>
<head>
<title>Upload Erfolgreich</title>
</head>
<body>
<p>{{.Message}}</p>
<a href="/view/{{.Filename}}">Ihr Bild anzeigen</a>
</body>
</html>