【发布时间】:2017-11-12 12:48:21
【问题描述】:
在将大文件上传到使用 golang 的默认 net/http 包制作的服务器时,我遇到了一个很难调试的错误。上传代码如下:
uploadForm.onsubmit = () => {
const formData = new FormData(uploadForm);
const isPublic : boolean = (<HTMLInputElement>document.getElementById('public_switch')).checked;
formData.append('file', (<HTMLInputElement>document.getElementById('file')).files[0]);
formData.append('compression', (<HTMLInputElement>document.getElementById('compression')).value);
formData.append('public', String(isPublic));
const xhr = new XMLHttpRequest();
xhr.open("POST", "/upload/");
xhr.send(formData);
xhr.onreadystatechange = function() {
console.log(xhr.responseText);
}
}
我有一个用 golang 编写的服务器,我开始如下:
var server = &http.Server{
Addr: ":" + Configuration.Port,
ReadTimeout: 300 * time.Second,
WriteTimeout: 300 * time.Second,
ReadHeaderTimeout: 300 * time.Second,
MaxHeaderBytes: 500000000}
http.HandleFunc("/upload/", uploadFile)
server.ListenAndServe()
最后我接受并使用以下代码解析文件
func uploadFile(w http.ResponseWriter, r *http.Request) {
//Parsing the upload arguments into the values we shall be working with
r.ParseMultipartForm(5000000000000000)
file, _, err := r.FormFile("file")
//etc
现在,代码本身在 'r.FormFile("file")' 处失败,并带有非常描述性的错误消息:“multipart: NextPart: EOF”
是否有某种文件限制或超时设置,我可能没有在 go 代码或 javascript 中设置?我要上传的文件约为 1.7GB,因此显然符合 http 支持的限制。
知道如何在不必深入研究 FormFile 或捕获请求本身的情况下更好地调试此问题吗?该代码适用于较小的文件(几 Mb)。
【问题讨论】:
-
将
ReadTimeout设置为5 mins后,是否可以在超时前传输1.7GB文件? -
开始传输后约 10 秒内出现错误。它是在 lo 上完成的,所以我认为超时不是问题,我只是将其设置为 5 分钟以解决问题。
-
内容似乎没有发送到服务器。单独测试服务器。请查看stackoverflow.com/a/33809474 并尝试一下。
-
两个故障排除提示:您可以尝试使用不同的客户端上传数据。 Wireshark 会告诉你哪一方断开了连接。
-
好的,所以,显然问题是(现在我想起来很明显),这里:formData.append('file', (
document.getElementById('file')) .files[0]);
标签: javascript file http typescript go