5

文档中据说

如果存储在磁盘上,文件的底层具体类型将是 *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
}
4

3 回答 3

6

您可以利用 multipart.File 实现 io.Seeker 的事实来查找其大小。

cur, err := file.Seek(0, 1)
size, err := file.Seek(0, 2)
_, err := file.Seek(cur, 0)

第一行查找文件的当前偏移量。第二个搜索到文件的末尾并返回它相对于文件开头的位置。这是文件的大小。第三个寻求我们在尝试找到大小之前的偏移量。

您可以在此处阅读有关 seek 方法的更多信息。

于 2013-03-09T13:18:09.550 回答
2

如果你调用parseMultipartForm(0)它会将整个文件写入磁盘而不是在内存中存储任何内容,f, _ := FormFile("file")然后你可以使用fi, _ := f.(*os.File).Stat()

于 2013-03-08T15:11:19.933 回答
1

根据您要对数据执行的操作,最好的办法可能是使用 ioutil.ReadAll 将文件读入字节片。(无论如何,您最终可能希望将数据作为字节切片。)一旦完成,您就可以使用 len 找到长度。

于 2013-03-08T20:44:54.630 回答