multipart.Writer
来实现 POST
上传文件到我以前的一个 Java 版本的文件服务器上. for _, uf := range uploadFiles {
fileInfo, _ := os.Stat(uf)
file, _ := os.Open(uf)
fileWrite, _ := mpWrite.CreateFormFile("file", filepath.Base(uf))
writeLength, _ := io.Copy(fileWrite, file)
assert.Equal(t, fileInfo.Size(), writeLength, "拷贝文件的内容到内存缓冲区中")
_ = file.Close()
}
io.Copy(fileWrite, file)
来看, 需要把文件的所有内容都拷贝到 bytes.Buffer
实例中, 在上传大文件时必然占用大量内存. 实测验证果然, 占用的内存量为 2倍文件大小
.go
源码中的 multipart.Writer
, 重写一个 VirtualWriter
, 实现按需读取文件内容并发送,从而可以支持超过 4G 的文件上传。multipart.Writer
, 支持多个 field, file ;CreateFormFile
时不需要将文件内容都读入内存,而是保存信息,在 Read 时按需读取;onProgressCallback
回调, 从而可以知道文件上传进度( 这个功能似乎不容易合并到 go sdk 中 )https://github.com/fishjam/go-library/blob/main/mime/multipart/virtual_writer.go
国内镜像: https://gitee.com/fishjam/go-library
https://github.com/fishjam/go-library/blob/main/mime/multipart/virtual_writer_test.go