2013-03-08 18 views
5

W the docs jest powiedziane, żeGo - Czym tak naprawdę jest wieloczęściowy. Plik?

przechowywany na dysku, bazowy typ konkretny plik będzie być * os.File.

W tym przypadku wszystko jest jasne. Wspaniały. Ale co się stanie, jeśli nie, jeśli plik jest przechowywany w pamięci?

Moim rzeczywistym problemem jest to, że próbuję uzyskać rozmiar różnych plików przechowywanych w pamięci, które dostałem przez formularz html, ale nie mogę użyć os.Stat do zrobienia fileInfo.Size(), ponieważ ja nie t mieć lokalizację pliku, tylko jego nazwę.

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 
} 

Odpowiedz

6

Można wykorzystać fakt, że multipart.File wdraża io.Seeker, aby znaleźć jego rozmiar.

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

Pierwszy wiersz znajduje aktualne przesunięcie pliku. Drugi szuka końca pliku i zwraca go w stosunku do początku pliku. Jest to rozmiar pliku. Trzeci szuka przesunięcia, w którym byliśmy, zanim spróbujemy znaleźć rozmiar.

Możesz przeczytać więcej na temat metody szukania here.

+0

Dzięki, pomyślałem o możliwym rozwiązaniu takim jak ten, ale nigdy nie korzystałem z metody Seek i nie wiedziałem, że było tak łatwe w użyciu :) – AlvaroSantisteban

2

jeśli zadzwonisz parseMultipartForm(0) to zapisze cały plik na dysk zamiast zapisywania czegokolwiek w pamięci, a następnie f, _ := FormFile("file") następnie można wykonać stat plik z fi, _ := f.(*os.File).Stat()

1

W zależności od tego, co chcesz zrobić z danych, najlepszą rzeczą do zrobienia może być odczytywanie pliku do bajtów z ioutil.ReadAll. (W każdym razie możesz chcieć danych w postaci bajtów.) Kiedy już to zrobisz, znajdź długość z len.

Powiązane problemy