在the docs中,据说
如果存储在磁盘上,File的底层具体类型将是 * os.File。
在这种情况下,一切都很清楚。大。但是,如果没有,如果文件存储在内存中会发生什么?
我的实际问题是我试图通过html表单获取存储在内存中的不同文件的大小但是我不能使用os.Stat来执行fileInfo.Size()因为我没有有文件的位置,只是它的名字。
fhs := req.MultipartForm.File["files"]
for _, fileHeader := range fhs {
file, _ := fileHeader.Open()
log.Println(len(file)) // Gives an error because is of type multipart.File
fileInfo, err := os.Stat(fileHeader.Filename) // Gives an error because it´s just the name, not the complete path
// Here I would do things with the file
}
答案 0 :(得分:6)
您可以利用multipart.File实现io.Seeker来查找其大小的事实。
cur, err := file.Seek(0, 1)
size, err := file.Seek(0, 2)
_, err := file.Seek(cur, 0)
第一行找到文件的当前偏移量。第二个寻找文件的末尾并返回它与文件开头的关系。这是文件的大小。第三个是在寻找尺寸之前寻求我们所处的抵消。
您可以详细了解搜索方法here。
答案 1 :(得分:2)
如果你拨打parseMultipartForm(0)
这会将整个文件写入磁盘,而不是将任何内容存储在内存中,然后f, _ := FormFile("file")
,然后您可以使用fi, _ := f.(*os.File).Stat()
答案 2 :(得分:1)
根据您对数据的处理方式,最好的办法是使用ioutil.ReadAll将文件读入字节切片。 (无论如何,您最终可能希望将数据作为字节切片。)完成后,您可以使用len查找长度。