picture-uploader/go/main.go

110 lines
3 KiB
Go
Executable file

package main
import (
"fmt"
_ "html/template"
"io"
"log"
"net/http"
"os"
"sync"
"time"
)
var (
lastUploadTime time.Time
mu sync.Mutex
uploadInterval = 10 * time.Second
)
func main() {
http.HandleFunc("/", homeHandler)
http.HandleFunc("/upload", uploadHandler)
http.HandleFunc("/view/", viewHandler)
fmt.Println("Server listening on :8080")
http.ListenAndServe(":8080", nil)
}
func homeHandler(w http.ResponseWriter, r *http.Request) {
// Hier können Sie eine HTML-Templatedatei für die Homepage erstellen
// und sie mit template.Execute laden.
fmt.Fprint(w, "Willkommen! Besuchen Sie /upload, um Bilder hochzuladen.")
}
func uploadHandler(w http.ResponseWriter, r *http.Request) {
mu.Lock()
defer mu.Unlock()
if time.Since(lastUploadTime) < uploadInterval {
http.Error(w, "Nur alle 10 Sekunden erlaubt", http.StatusTooManyRequests)
log.Printf("Bildupload zu häufig. Nur alle 10 Sekunden erlaubt.")
return
}
if r.Method == http.MethodPost {
file, handler, err := r.FormFile("image")
if err != nil {
http.Error(w, "Fehler beim Lesen der Datei", http.StatusInternalServerError)
log.Printf("Fehler beim Lesen der Datei: %v", err)
return
}
defer file.Close()
// Hier können Sie den Dateinamen manipulieren oder einen anderen Speicherort wählen
uploadPath := "./uploads/" + handler.Filename
f, err := os.Create(uploadPath)
if err != nil {
http.Error(w, "Fehler beim Erstellen der Datei", http.StatusInternalServerError)
log.Printf("Fehler beim Erstellen der Datei: %v", err)
return
}
defer f.Close()
_, 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
}
lastUploadTime = time.Now() // Setzen Sie die Zeit des letzten Uploads
// Erfolgsmeldung mit dem Link ausgeben
link := fmt.Sprintf("Bild erfolgreich hochgeladen. Sie können es hier anzeigen: <a href='/view/%s'>Anzeigen</a>", handler.Filename)
// Schreiben Sie den Link als HTML in die Antwort
w.Header().Set("Content-Type", "text/html; charset=utf-8")
fmt.Fprint(w, link)
} else {
// HTML-Formular für Bild-Upload hier anzeigen
form := `<html><body>
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="image">
<input type="submit" value="Hochladen">
</form>
</body></html>`
fmt.Fprint(w, form)
}
}
func viewHandler(w http.ResponseWriter, r *http.Request) {
filePath := r.URL.Path[len("/view/"):]
imagePath := "./uploads/" + filePath
// Öffnen und Lesen der Bilddatei
imageFile, err := os.Open(imagePath)
if err != nil {
http.Error(w, "Bild nicht gefunden", http.StatusNotFound)
log.Printf("Fehler beim Öffnen des Bildes: %v", err)
return
}
defer imageFile.Close()
// Kopieren des Bildes in die HTTP-Antwort
_, copyErr := io.Copy(w, imageFile)
if copyErr != nil {
log.Printf("Fehler beim Senden des Bildes: %v", copyErr)
return
}
}