Невозможно перенаправить в веб-приложение golang.Он прилипает к одной странице - PullRequest
0 голосов
/ 18 марта 2019

Это фрагмент кода из файла 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 голосов
/ 18 марта 2019

Ваш код записывается на ResponseWriter перед попыткой отправки перенаправления.

После первой записи в ResponseWriter код состояния (200 OK) и заголовки отправляются, если они еще не были отправлены, а затем данные, которые вы передали в устройство записи.

Если вы намереваетесь отправить перенаправление HTTP, вы не можете написать тело ответа в ResponseWriter. Из-за того, что вы читаете свой код, не имеет особого смысла, зачем вы пишете в него. Они выглядят как отладочные операторы печати, которые вы, вероятно, должны отправить os.Stderr или регистратору вместо тела ответа веб-страницы.

...