在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/HTML5  GO  網(wǎng)絡安全/ Golang的服務端無法接收HTML提交的文件

Golang的服務端無法接收HTML提交的文件

初學Golang做服務端,現(xiàn)在遇到了一個問題:當使用HTML提交文件的時候,瀏覽器可以獲取服務器發(fā)送的html,但是如果本地提交的話,到瀏覽器端會被定位成首頁,具體問題在代碼中標出了,請會的同學幫忙解決一下,謝謝!

這是服務端發(fā)送的html文件:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>上傳文件</title>
</head>
<body>
<form enctype="multipart/form-data" action="http//localhost:9090/upload" method="post">
    <input type="file" name="uploadfile"/>
    <input type="hidden" name="token" value="{{.}}"/>
    <input type="submit" value="upload"/>
</form>
</body>
</html>

這是代碼,還有其他的(數(shù)據(jù)庫、一些校驗等),我在這里都省略了,只保留了出問題的部分,能直接運行:

import (
    "crypto/md5"
    "fmt"
    "html/template"
    "io"
    "net/http"
    "os"
    "strconv"
    "time"
)

func upload(w http.ResponseWriter, r *http.Request) {
    fmt.Println("method: ", r.Method)  // 查看方法
    if r.Method == "GET" {
        curtime := time.Now().Unix()
        h := md5.New()
        io.WriteString(h, strconv.FormatInt(curtime, 10))
        token := fmt.Sprintf("%x", h.Sum(nil))
        t, _ := template.ParseFiles("upload.html")
        t.Execute(w, token)
        fmt.Println("upload get")   // 這里能輸出,也就是說可以獲取服務器的消息
    } else {
        fmt.Println("upload post")  // 這里始終進不來,提交的時候404
        r.ParseMultipartForm(32 << 20)
        // 獲取文件句柄
        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)
    }
}

func main() {
    http.HandleFunc("/upload", upload)
    err := http.ListenAndServe(":9090", nil)
    if err != nil {
        fmt.Println(err)
    }
}
回答
編輯回答
青裙

很尷尬,我覺得吧...你好像地址打錯了:
action="http//localhost:9090/upload"
應該是:
action="http://localhost:9090/upload"
少了引號。?;蛘吣阌孟鄬Φ刂泛命c
action="/upload"

2017年12月11日 14:11
編輯回答
心沉
package main

import (
    "net/http"
    "io"
    "os"
)

func main() {
    http.HandleFunc("/upload", func(w http.ResponseWriter, r *http.Request) {
        if r.Method == "GET" {
            w.Header().Set("Content-Type", "text/html;charset=utf-8")
            io.WriteString(w, `<form method="post" action="http://localhost:9090/upload" enctype="multipart/form-data">
<input type="file" name="file"/>
<button type="submit">上傳</button>
</form>`)
            return
        }
        if r.Method == "POST" {
            r.ParseMultipartForm(1024 * 1024 * 10) // 允許上傳10M
            fp, fileHeader, err := r.FormFile("file")
            if err != nil {
                http.Error(w, err.Error(), 500)
                return
            }
            defer fp.Close()
            localFp, err := os.OpenFile("./test/"+fileHeader.Filename, os.O_WRONLY|os.O_CREATE, 0666)
            if err != nil {
                http.Error(w, err.Error(), 500)
                return
            }
            defer localFp.Close()
            io.Copy(localFp, fp)
            io.WriteString(w, "success")
            return
        }
        http.Error(w, http.StatusText(http.StatusMethodNotAllowed), http.StatusMethodNotAllowed)
    })
    http.ListenAndServe(":9090", nil)
}

clipboard.png
可以直接上傳的

2017年5月8日 16:57