Go - 什么是真正的multipart.File?

时间:2013-03-08 13:52:50

标签: go

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
}

3 个答案:

答案 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查找长度。