无法在golang网络应用中重定向。坚持一页

时间:2019-03-18 09:31:22

标签: go web-applications

这是一个名为upload.go的文件的代码片段。 我尝试了很多方法来重定向到另一个页面。当POST中的语句完成运行时,我想重定向到另一个页面。

package main

import (
    "fmt"
    "io"
    "net/http"
    "os"
    "text/template"
)

func upload(w http.ResponseWriter, r *http.Request) {

    if r.Method == "GET" {
        // GET
        t, _ := template.ParseFiles("upload.gtpl")

        t.Execute(w, nil)

    } else if r.Method == "POST" {
        // Post
        file, handler, err := r.FormFile("uploadfile")
        if err != nil {
            fmt.Println(err)
            return
        }
        defer file.Close()

        fmt.Fprintf(w, "%v", handler.Header)
        f, err := os.OpenFile("./test/"+handler.Filename, os.O_WRONLY|os.O_CREATE, 0666)
        if err != nil {
            fmt.Println(err)
            return
        }
        defer f.Close()

        io.Copy(f, file)

        img, err := imgio.Open("./test/" + handler.Filename)
        if err != nil {
            panic(err)
        }

        inverted := effect.Invert(img)
        if err := imgio.Save("filename.png", inverted, imgio.PNGEncoder()); err != nil {
            panic(err)
        }

        fmt.Fprintf(w, "%v", handler.Header)
        http.Redirect(w, r, "www.google.com", http.StatusMovedPermanently)

    } else {
        fmt.Println("Unknown HTTP " + r.Method + "  Method")
    }
}

func main() {
    http.HandleFunc("/upload", upload)
    http.HandleFunc("/hi", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "Hi")
        http.Redirect(w, r, "www.google.com", http.StatusMovedPermanently)
    })

    http.ListenAndServe(":9090", nil) // setting listening port
}

无论我做什么,它都会保留在上传页面上。谁能帮我调试一下吗?

1 个答案:

答案 0 :(得分:0)

您的代码在尝试发送重定向之前正在写入ResponseWriter

在第一个writeResponseWriter上,如果尚未发送状态码(200 OK)和标头,则发送状态码(200 OK),然后将其传递给写入器。

如果打算发送HTTP重定向,则不能将任何响应正文写入ResponseWriter。通过阅读您的代码,为什么您首先要编写代码并没有多大意义。它们看起来像调试打印语句,您可能应该将其发送给os.Stderr或记录器,而不是网页响应正文。