【问题标题】:Go - What is really a multipart.File?Go - 什么是真正的 multipart.File?
【发布时间】:2013-03-08 13:52:50
【问题描述】:

the docs据说

如果存储在磁盘上,文件的底层具体类型将是 *os.文件。

在这种情况下,一切都很清楚。伟大的。但是,如果不是,如果文件存储在内存中会怎样?

我的实际问题是,我试图获取通过 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
}

【问题讨论】:

    标签: go


    【解决方案1】:

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

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

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

    你可以阅读更多关于seek方法here的内容。

    【讨论】:

    • 谢谢,我在想这样一个可能的解决方案,但从未使用过 Seek 方法,也不知道它是如此易于使用:)
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2016-05-09
        • 1970-01-01
        • 1970-01-01
        • 2010-12-05
        • 2010-12-31
        • 2019-10-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多