先直接给答案: 是也不是(取决于你的配置和实现方式)
今天看到社区有人问了一个问题: 为什么
PHP
文件上传是直接用move_uploaded_file
移动一个上传好的文件,而不是从HTTP Body
中读取出文件内容.
Go
的文件上传的实现.Go
中获取上传的文件方式很简单, 只要通过http.Request.FormFile
方法即可拿到上传的文件http.Request.FormFile
的实现也比较简单, 直接从一个map
里拿到想要的数据http.Request.ParseMultipartForm
http.Request.ParseMultipartForm
方法解析参数, 其中又调用了multipart.Reader.ReadForm
去读取Body
中的内容maxMemory
参数是否大于上传的文件大小(多个文件合计计算)maxMemory
限制,不过给了10M
.意思是我们如果设置maxMemory=32M
, 那么提交的Body
最大只能42M
(上传文件还是32M
)Body
小于maxMemory
那么就直接把上传的文件读取到内存中操作,否则写入到临时文件夹(写入临时文件这个和PHP
操作一致)io.Copy(file, io.MultiReader(&b, p))
, 我们来查看p
和b
的来源b
比较简单,就是从p
中copy
出来maxValueBytes+1
个字节, 所以它是来源于p
p
的来源如下 multipart.Reader
multipart.Reader
来源于http.request.Body
http.request.Body
来源于http.readTransfer
方法,然后从http.conn.bufr
读取出来c.bufr
的来源是如下代码, 实际上还是连接c
只不过封装了好几层io.Reader
接口, 可以不断从请求中读取出数据.Body
数据呢? Body
的内容肯定是从上到下,文件可能在最前面,可能在最后面Body
,如果第一个部分是文件, 并且太大的话只能先写到临时文件夹Go
中的Request Body
只能读取一次