`io.Copy`文件大小与原始大小不同



我正在处理多部分/表单数据文件上传,我的后端使用Goio.Copy将表单数据复制到本地文件。

func SaveFileHandler() error {
...
file := form.File["file_uploaded"] // file uploaded in form
src, _ := file.Open()
// here the original file size is 35540353 in my case, 
// which is a video/mp4 file
fmt.Println(file.Size) 
// create a local file with same filename
dst, _ := os.Create(file.Filename)
// save it
_, err = io.Copy(dst, src)
// err is nil
fmt.Println(err) 
stat, _ := dst.Stat()
// then the local file size differs from the original updated one. Why?
// local file size becomes 35537281 (original one is 35540353)
fmt.Println(stat.Size()) 
// meanwhile I can't open the local video/mp4 file, 
// which seems to be broken due to losing data from `io.Copy`
...

怎么可能呢?io.Copy是否有最大缓冲区大小?或者文件mime类型在这种情况下重要吗
我尝试了png和txt文件,两者都按预期工作。

Go版本为go1.12.6 linux/amd64

您的问题中没有太多信息,但根据您所说,我敢打赌,在调用dst.Stat()之前,数据不会完全刷新到文件中。您可以先关闭文件以确保数据被完全刷新:

func SaveFileHandler() error {
...
// create a local file with same filename
dst, _ := os.Create(file.Filename)
// save it
_, err = io.Copy(dst, src)
// Close the file
dst.Close()
// err is nil
fmt.Println(err) 
stat, _ := dst.Stat()    
...

最新更新