账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    Golang的服务端无法接收HTML提交的文件
    57
    0

    初学Golang做服务端,现在遇到了一个问题:当使用HTML提交文件的时候,浏览器可以获取服务器发送的html,但是如果本地提交的话,到浏览器端会被定位成首页,具体问题在代码中标出了,请会的同学帮忙解决一下,谢谢!

    这是服务端发送的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>

    这是代码,还有其他的(数据库、一些校验等),我在这里都省略了,只保留了出问题的部分,能直接运行:

    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)
        }
    }
    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 耳下落腮红 普通会员 1楼

      在Golang中,服务器无法接收HTML提交的文件,可能是由于以下几个原因:

      1. HTML代码中没有正确地包含文件上传的按钮或选项。在HTML文件中,应该使用<input type="file">来让用户选择文件,而不是使用<button>标签。在HTML文件中,应该使用<input type="file">来让用户选择文件,并且文件名应该与服务器的目录结构一致。

      2. 文件上传的URL和服务器的目录结构不匹配。如果服务器的目录结构与HTML文件中选择的文件目录不匹配,那么用户上传的文件可能无法正确地保存到服务器。

      3. 服务器没有正确地处理文件上传。在Golang中,服务器可以使用http.ResponseWriter来响应文件上传的请求。如果服务器没有正确地处理文件上传,那么文件可能无法正确地保存到服务器。

      解决这些问题的方法是:

      1. 在HTML文件中正确地包含文件上传的按钮或选项。

      2. 确保文件上传的URL和服务器的目录结构匹配。

      3. 在服务器端正确地处理文件上传。这可能需要使用不同的库或框架,例如httpuvgorilla-mux等。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部