golang上传文件的坑

作者: aries 分类: Go 发布时间: 2021-09-28 13:59 ė 450次浏览 6 0评论

我们在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())
}
换一个
暂无评论
Ɣ回顶部