首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Golang mux http.FileServer未返回图像

Golang mux http.FileServer未返回图像
EN

Stack Overflow用户
提问于 2019-10-23 09:28:32
回答 1查看 973关注 0票数 0

我是go的新手,正在尝试设置go服务器。我的意图是在命中url时返回一个图像。

这就是我所做的

代码语言:javascript
复制
myRouter := mux.NewRouter()
myRouter.HandleFunc("/poster_path/{id}",posterfunc)

这是我的帖子

代码语言:javascript
复制
func posterfunc(w http.ResponseWriter, r *http.Request){
    w.Header().Set("Content-Type", "image/jpeg")
    vars := mux.Vars(r)
    key := vars["id"]
    var url = "/home/rakshithjk/Desktop/poster/"+key+".jpg"
    http.FileServer(http.Dir(url))
}

这是Postman的输出-

任何帮助都将不胜感激。

更新-尝试将http.FileServer更改为http.ServeFile,但输出仍保持修改后的处理程序函数

代码语言:javascript
复制
func posterfunc(w http.ResponseWriter, r *http.Request){
    w.Header().Set("Content-Type", "image/jpeg")
    vars := mux.Vars(r)
    key := vars["id"]
    var url = "/home/rakshithjk/Desktop/poster/"+key+".jpg"
    http.ServeFile(w, r,url)

这是我的整个文件内容(供参考)

代码语言:javascript
复制
package main

import (
    "fmt"
    "log"
    "net/http"
    "encoding/json"
    "database/sql"
    _ "github.com/go-sql-driver/mysql"
    "github.com/gorilla/mux"
    //"github.com/davecgh/go-spew/spew"
)


func handleRequests() {
    myRouter := mux.NewRouter()
    myRouter.HandleFunc("/", homePage)
    myRouter.HandleFunc("/movie/top_rated", returnSingleArticle)
    myRouter.HandleFunc("/poster_path",posterfunc)

    log.Fatal(http.ListenAndServe(":10000", myRouter))
}

func enableCors(w *http.ResponseWriter) {
    (*w).Header().Set("Access-Control-Allow-Origin", "*")

}
type movie_list struct {
    Page int `json:"page"`
    Results []movie `json:"results"`
}
type movie struct {
    Id      int `json:"id"`
    Title   string `json:"title"`
    Language    string `json:"language"`
    Release_date string `json:"release_date"`
    Poster_path string `json:"poster_path"`
    Background_path string `json:"background_path"`
    Overview string `json:"overview"`
    Genre_ids string `json:"genre_ids"`
}

func posterfunc(w http.ResponseWriter, r *http.Request){
     w.Header().Set("Content-Type", "image/jpeg")
    //vars := mux.Vars(r)
    //key := vars["id"]
    enableCors(&w)

    var url = "/home/rakshithjk/go/src/clumio/112.png"
    fmt.Fprintf(w, "Hello, %q\n", url)
    http.ServeFile(w, r,url)
}

func homePage(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Welcome to the HomePage!")
    fmt.Println("Endpoint Hit: homePage")
}

func returnSingleArticle(w http.ResponseWriter, r *http.Request) {
    //vars := mux.Vars(r)
    //key := vars["id"]
    enableCors(&w)
    db, err := sql.Open("mysql", "root:72574484@tcp(127.0.0.1:3306)/PicturePerfect")
             if err != nil {
                 fmt.Println(err)
                 }else{
                 fmt.Println("Connection Established")
             }
    rows,err:=db.Query("select * from movies limit 10")

         if err!=nil{
            fmt.Println(err)
         }

         var list movie_list
         var tag movie

         for rows.Next(){

             err:=rows.Scan(&tag.Id,&tag.Title,&tag.Language,&tag.Release_date,&tag.Poster_path,&tag.Background_path,&tag.Overview,&tag.Genre_ids)
             if err != nil {
             fmt.Println(err)
            }
            fmt.Println(tag.Id)
            list.Results = append(list.Results,tag)
         }

        err = rows.Err()
        if err != nil {
            fmt.Println(err)
        }

        defer db.Close()


            //fmt.Fprintf(w, "Hello, %q\n", list.Results[3])
            w.Header().Set("Content-Type", "application/json")
            json.NewEncoder(w).Encode(list) 
            //spew.Dump(list)
            //fmt.Fprintf(w, "given lamguage, %q\n", tag.Poster_path)



}

func main() {
    handleRequests()

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-23 09:35:51

不应该在这样的函数中调用http.FileServer()。它返回一个Handler function (一个类似于您创建的posterfunc的函数)。

它应该用作路由配置中的处理函数,如下所示:

代码语言:javascript
复制
myRouter.HandleFunc("/poster_path/",http.FileServer(http.Dir("./your_dir")))

您可以在这里找到documentation for http.FileServer,其中包含一些更详细的示例。

This blog post一步一步地解释了如何设置它。

更新:

如果你想在你的处理程序中使用它,你应该使用http.ServeFile。它将使用指定文件或目录的内容来响应请求。

Docs here

代码语言:javascript
复制
func posterfunc(w http.ResponseWriter, r *http.Request){
    w.Header().Set("Content-Type", "image/jpeg")
    vars := mux.Vars(r)
    key := vars["id"]
    var url = "/home/rakshithjk/Desktop/poster/"+key+".jpg"
    http.ServeFile(w, r, url)
}

更新2:

新代码片段中的问题是,您在提供文件之前打印到界面。删除此行:

代码语言:javascript
复制
fmt.Fprintf(w, "Hello, %q\n", url)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58514228

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档