2013-03-08 48 views
5

the docs據說Go - 什麼是多部分。文件?

如果存儲在磁盤上,文件的底層的具體類型將是一個 * 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 
} 

回答

6

您可以利用multipart.File實現io.Seeker來查找其大小的事實。

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

第一行查找文件的當前偏移量。第二個查找文件的結尾,並返回與文件開頭相關的位置。這是文件的大小。第三個試圖找到我們在找到大小之前的偏移量。

您可以閱讀更多關於查找方法here的信息。

+0

謝謝,我在想像這樣一個可能的解決方案,但從來沒有使用Seek方法,並不知道它是如此容易使用:) – AlvaroSantisteban 2013-03-11 10:29:32

2

如果你打電話parseMultipartForm(0)這將寫入整個文件保存到磁盤,而不是在內存中存儲任何東西,其次是f, _ := FormFile("file")那麼你可以統計文件與fi, _ := f.(*os.File).Stat()

1

根據你想用做什麼數據,最好的做法可能是使用ioutil.ReadAll將文件讀入字節片。 (無論如何,最終你可能需要將數據作爲字節片段)。一旦你完成了,你就可以用len找到長度。