2017-05-11 1 views
0

Ich bin ziemlich sicher, dass ich etwas offensichtlich übersehen habe, aber ich bin mir nicht sicher, was. Ich erstelle eine einfache Webanwendung, die Vorlagenvorlagen für Bücher bereitstellt. Die Vorlage funktioniert einwandfrei, und der Pfad für das Bild scheint korrekt zu füllen, aber ich erhalte immer einen Fehler 404 für das Bild selbst. HierGolang Webserver dient nicht als statische Dateien

ist die Vorlage:

<h1>{{.Title}}</h1> 
<h2>{{.Author.Name}}</h2> 
<image src="../images/{{.ImageURI}}" /> 

und hier ist die Anwendung selbst:

package main 
import (
    "html/template" 
    "log" 
    "net/http" 
    "time" 

    "github.com/gorilla/mux" 
    "github.com/user/marketplace/typelibrary" 
) 

var books []typelibrary.Book 

func ItemHandler(w http.ResponseWriter, r *http.Request) { 
    params := mux.Vars(r) 
    var selected typelibrary.Book  
    //Retrieve item data 
    for _, item := range books { 
     if item.ID == params["id"] { 
      selected = item 
      break 
     } 
    } 
    t, _ := template.ParseFiles("./templates/book.html") 
    t.Execute(w, selected) 
} 

func main() { 
    router := mux.NewRouter() 
    books = append(books, typelibrary.Book{ID: "1", Title: "The Fellowship of the Ring", ImageURI: "LotR-FotR.jpg", Author: &typelibrary.Author{Name: "JRR Tolkien"}}) 
    books = append(books, typelibrary.Book{ID: "2", Title: "The Two Towers", ImageURI: "LotR-tTT.jpg", Author: &typelibrary.Author{Name: "JRR Tolkien"}}) 
    books = append(books, typelibrary.Book{ID: "3", Title: "The Return of the King", ImageURI: "LotR-RotK.jpg", Author: &typelibrary.Author{Name: "JRR Tolkien"}}) 
    books = append(books, typelibrary.Book{ID: "4", Title: "Monster Hunter International", ImageURI: "MHI1.jpg", Author: &typelibrary.Author{Name: "Larry Correia"}}) 

    router.Handle("/", http.FileServer(http.Dir("."))) 
    router.Handle("/images/", http.FileServer(http.Dir("../images/"))) 
    router.HandleFunc("/item/{id}", ItemHandler).Methods("GET") 

    srv := &http.Server{ 
     Handler:  router, 
     Addr:   ":8080", 
     WriteTimeout: 10 * time.Second, 
     ReadTimeout: 10 * time.Second, 
    } 
    log.Fatal(srv.ListenAndServe()) 
} 

Die Bilder im images Unterverzeichnis gespeichert sind, direkt unter dem Verzeichnis, in dem die ausführbare Datei ist. Wenn ich versuche, das unterbrochene Bild auf der Seite anzuzeigen, wird der Pfad als localhost:8080/images/[imagename] angezeigt, gibt aber einen 404-Fehler. Welche Konfigurations- oder Routing-Optionen fehle ich hier?

+0

Sie übergeben fast sicher den falschen Pfad zu "http.Dir". Warum? ../? Führen Sie den Server aus einem Unterverzeichnis aus? Ich würde erwarten, dass Sie './Images /' basierend auf Ihrer Beschreibung wünschen. – Flimzy

+0

@Flimzy Sie sind richtig, sollte es richtig sein './Images /', aber das Problem besteht auf jeden Fall weiter. – FreeRangeOyster

+2

Wir kennen nicht Ihre Verzeichnisstruktur und wie Sie Ihren Server starten, aber diese Antworten enthalten die Lösung: [404 Seite nicht gefunden - Go Rendern CSS-Datei] (http://stackoverflow.com/questions/28293452/404-page -nicht gefunden-go-rendering-css-Datei/28294524 # 28294524); und [Warum muss ich http.StripPrefix verwenden, um auf meine statischen Dateien zuzugreifen?] (http://stackoverflow.com/questions/27945310/why-do-i-need-to-use-http-stripprefix-to-access -my-static-files/27946132 # 27946132) – icza

Antwort

3

Sie erstellen Ihre Route falsch, um Ihre Bilder zu liefern. Die Router.Handle()-Methode gleicht URLs mit dem Path()-Matcher ab, der den gesamten Pfad abgleicht, während Sie eigentlich jeden Pfad abgleichen möchten, der mit "/ image /" beginnt. Erstellen Sie stattdessen die Route mit dem PathPrefix() Matcher:

var imgServer = http.FileServer(http.Dir("./images/")) 
router.PathPrefix("/images/").Handler(http.StripPrefix("/images/", imgServer)) 

Siehe https://godoc.org/github.com/gorilla/mux#Router.Handle für weitere Informationen.

Verwandte Themen