英文:
golang - which function for uploading large files
问题
在Go语言中,有几种不同的方法可以读取通过多部分表单发送的文件:
-
r.FormFile("file")
:这个方法可以直接从请求中获取指定字段名的文件。它适用于小型文件,但对于大型文件可能会占用较多的内存。 -
r.MultipartReader()
:这个方法返回一个multipart.Reader
对象,可以用于逐个读取多部分表单中的各个部分。使用这种方法可以更加灵活地处理文件,但需要手动解析和处理每个部分。 -
r.ParseMultipartForm(size)
:这个方法会解析整个多部分表单,并将文件存储在内存中或临时文件中,以供后续处理。通过指定size
参数,可以限制内存使用量。这种方法适用于处理大型文件,因为它可以将文件存储在临时文件中,减少内存占用。
对于处理大型文件(约1GB),最好使用r.ParseMultipartForm(size)
方法,通过限制内存使用量来处理文件。这样可以避免占用过多的内存。
而对于占用较少内存的方法,可以考虑使用r.MultipartReader()
方法,逐个读取并处理文件部分,避免将整个文件存储在内存中。
英文:
In go there are different ways to read a file sent with a multipart form
r.FormFile("file")
r.MultipartReader()
r.ParseMultipartForm(size)
and I partially understand the difference between them, however which is it the best for handling large files (~1GB)?
And, which is the one that uses less memory?
答案1
得分: 5
ParseMultipartForm
函数用于解析multipart/form-data
格式的请求体。整个请求体会被解析,其中最多maxMemory
字节的文件部分会被存储在内存中,剩余部分会被存储在临时文件中。如果需要,ParseMultipartForm
函数会调用ParseForm
函数。在调用一次ParseMultipartForm
之后,后续的调用不会产生任何效果。
因此,你可以通过调用r.ParseMultipartForm(max)
来控制最大的内存使用量,并且可以通过使用http.MaxBytesReader
来控制从请求中读取的总量。
另外,你还可以参考这个回答:https://stackoverflow.com/a/28292505/556573。
英文:
https://golang.org/pkg/net/http/#Request.ParseMultipartForm
> ParseMultipartForm parses a request body as multipart/form-data. The whole request body is parsed and up to a total of maxMemory bytes of its file parts are stored in memory, with the remainder stored on disk in temporary files. ParseMultipartForm calls ParseForm if necessary. After one call to ParseMultipartForm, subsequent calls have no effect.
You can therefore control the maximum memory usage by calling r.ParseMultipartForm(max)
, and you can control the total amount read from the request by using http.MaxBytesReader
.
Also see this answer: https://stackoverflow.com/a/28292505/556573
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论