golang上传文件的坑

aries 发表于 2021-09-28 791 次浏览 标签 : golang上传文件go

我们在golang的web程序中上传文件基本上都是用
func (r *Request) FormFile(key string) (multipart.File, *multipart.FileHeader, error)
这个方式获取上传的文件对象
用它返回的值来判断文件大小和文件的信息
它的的返回值 multipart.File 是一个 interface ,只要实现这个 interface 里的方法的类型都可以。
实现的方法如下:

// 获取文件大小的接口
type Size interface {
	Size() int64
}
if sizeInterface, ok := file.(Size); ok {
	fmt.Fprintf(w, "上传文件的大小为: %d", sizeInterface.Size())
}

但是,在某些情况下,上面的代码有可能失效,比如上传大文件时。
估计是上传的小文件数据就放内存了,用了 multipart.sectionReadCloser 结构体存放,而超过一定大小,就存放在临时文件了,因此用 os.File 类型。

判断下类型,然后如果是文件的话用获取文件大小的方式来获取就可以了。

解决方案如下:

// 获取文件大小的接口
type Size interface {
	Size() int64
}
// 获取文件信息的接口
type Stat interface {
	Stat() (os.FileInfo, error)
}
if statInterface, ok := file.(Stat); ok {
	fileInfo, _ := statInterface.Stat()
	fmt.Fprintf(w, "上传文件的大小为: %d", fileInfo.Size())
}
if sizeInterface, ok := file.(Size); ok {
	fmt.Fprintf(w, "上传文件的大小为: %d", sizeInterface.Size())
}

0条评论

如需评论,请填写表单。
换一个

记住我的信息