【发布时间】:2021-08-13 18:45:49
【问题描述】:
我有 10GB 的大文件,我正在尝试通过 Postman 在 Go 中使用 multipart/form-data 上传。由于我不太了解 Go 中的文件上传是如何工作的,所以我在 YouTube 上找到了教程。
文件上传适用于较小的文件,但在较大的文件上总是崩溃并显示消息:“runtime: VirtualAlloc of 9193373696 bytes failed with errno=1455 致命错误:内存不足”。这是我正在尝试的代码:
err := r.ParseMultipartForm(500 << 20)
if err != nil {
fmt.Fprintln(w, err)
}
file, handler, err := r.FormFile("file")
if err != nil {
fmt.Fprintln(w, err)
}
fmt.Fprintln(w, handler.Filename)
fmt.Fprintln(w, handler.Size)
fmt.Fprintln(w, handler.Header.Get("Content-type"))
defer file.Close()
saveLocation := "C:\\Users\\Pc\\go\\src\\github.com\\test\\uptest"
tempFile, err := ioutil.TempFile(saveLocation, "upload")
if err != nil {
fmt.Fprintln(w, err)
}
defer tempFile.Close()
fileBytes, err := ioutil.ReadAll(file)
if err != nil {
fmt.Fprintln(w, err)
}
tempFile.Write(fileBytes)
【问题讨论】:
-
意识到建议的副本与下载而不是上传有关,但基本问题和解决方案是相同的(使用
io.copy而不是使用ReadAll和Write,这需要您持有内存中的文件)。 -
如果你上传一个大文件,你可以把它分成很多小文件;同时上传文件;并在服务器端合并它们。
-
@Brits 用于将文件下载到服务器或 PC。我需要将文件上传到服务器。不过还是谢谢。
-
@Brits 我尝试了许多其他解决方案,发现上传文件会在临时目录中复制,但不知道如何获取该副本。
标签: go