这是一个名为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
}
无论我做什么,它都会保留在上传页面上。谁能帮我调试一下吗?
答案 0 :(得分:0)
您的代码在尝试发送重定向之前正在写入ResponseWriter
。
在第一个write到ResponseWriter
上,如果尚未发送状态码(200 OK)和标头,则发送状态码(200 OK),然后将其传递给写入器。
如果打算发送HTTP重定向,则不能将任何响应正文写入ResponseWriter
。通过阅读您的代码,为什么您首先要编写代码并没有多大意义。它们看起来像调试打印语句,您可能应该将其发送给os.Stderr
或记录器,而不是网页响应正文。