Golang – 用于上传大文件的函数是哪个?

huangapple go评论83阅读模式
英文:

golang - which function for uploading large files

问题

在Go语言中,有几种不同的方法可以读取通过多部分表单发送的文件:

  1. r.FormFile("file"):这个方法可以直接从请求中获取指定字段名的文件。它适用于小型文件,但对于大型文件可能会占用较多的内存。

  2. r.MultipartReader():这个方法返回一个multipart.Reader对象,可以用于逐个读取多部分表单中的各个部分。使用这种方法可以更加灵活地处理文件,但需要手动解析和处理每个部分。

  3. 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

huangapple
  • 本文由 发表于 2016年3月28日 09:10:26
  • 转载请务必保留本文链接:https://go.coder-hub.com/36254522.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定