Go HTTP服务器在包含文件和文本的多部分表单上重置连接

pw9qyyiw  于 5个月前  发布在  Go
关注(0)|答案(1)|浏览(73)

我一直在尝试在Go中设置一个HTTP服务器,允许用户通过HTML表单上传文件。由于其他原因,该表单也会有文本输入。然而,在提交表单时,我的浏览器报告连接已重置(我尝试过Firefox和Chromium),检查显示服务器在重置之前甚至没有到达上传端点的处理函数,奇怪的是,当表单中只有文件和提交时,这种情况不会发生。
下面是一个最小的复制:

package main

import (
    "fmt"
    "net/http"
)

func showPage(w http.ResponseWriter, r *http.Request) {
    fmt.Fprint(w,
`<!DOCTYPE html>
<html>
    <body>
    <form enctype="multipart/form-data" action="/upload">
        <input type="file" name="file" />
        <input type="text" name="lol" />
        <input type="submit" value="upload" />
    </form>
</body>
</html>`)
}

func uploadHandler(w http.ResponseWriter, r *http.Request) {
    fmt.Println("yay!")
    fmt.Fprint(w, "yay!")
}

func main() {
    http.HandleFunc("/", showPage)
    http.HandleFunc("/upload/", uploadHandler)

    http.ListenAndServe(":8080", nil)
}

字符串
运行上面的代码并在http://localhost:8080/的表单中提交一个文件,应该会在服务器的控制台上显示一个“yay!”页面并打印“yay!”。相反,在提交一个足够大的文件时(非常小的文件不会导致问题),连接重置,控制台上没有任何内容。This 5MB audio sample足够大,对我来说会导致问题。
如果表单中的唯一输入是文件,出于某种原因,一切都运行得很好。

toe95027

toe950271#

处理程序不读取任何请求体。
在从处理程序返回时,当未读请求主体的大小大于262,144字节时,net/http服务器关闭连接。
客户端在尝试写入请求正文时接收到连接重置。客户端在阅读响应之前出错。
通过阅读请求体来修复。假设您需要一个多部分表单,那么调用ParseMultipartForm是读取请求体的最简单方法。

func uploadHandler(w http.ResponseWriter, r *http.Request) {
    if err := r.ParseMultipartForm(65535); err != nil {
        http.Error(w, "bad request", 400)
        return
    }
    fmt.Println("yay!")
    fmt.Fprint(w, "yay!")
}

字符串

相关问题