2013-03-08 19 views
5

In the docs si dice cheGo - Che cos'è veramente un file multipart.File?

Se memorizzato su disco, tipo concreto sottostante del file sarà un * os.File.

In questo caso è tutto chiaro. Grande. Ma cosa succede se non, se il file è memorizzato in memoria?

Il mio problema reale è che sto cercando di ottenere la dimensione dei diversi file archiviati in memoria che ho ottenuto con un modulo html ma non posso usare os.Stat per fare fileInfo.Size() perché non lo faccio t avere la posizione del file, solo il suo nome.

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 
} 

risposta

6

È possibile sfruttare il fatto che multipart.File implementa io.Seeker per trovare la sua dimensione.

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

La prima riga trova l'offset corrente del file. Il secondo cerca la fine del file e ritorna dove è in relazione all'inizio del file. Questa è la dimensione del file. Il terzo cerca l'offset in cui eravamo prima di provare a trovare la dimensione.

Ulteriori informazioni sul metodo di ricerca here.

+0

Grazie, stavo pensando a una possibile soluzione come questa, ma non ho mai usato il metodo Seek e non sapevo che era così facile da usare :) – AlvaroSantisteban

2

se si chiama parseMultipartForm(0) questo scriverà l'intero file su disco invece di memorizzare qualsiasi cosa in memoria, seguita da f, _ := FormFile("file") allora si può stat il file con fi, _ := f.(*os.File).Stat()

1

seconda di cosa si vuole fare con il dati, la cosa migliore da fare potrebbe essere quella di leggere il file in una sezione di byte con ioutil.ReadAll. (Potresti volere i dati come una sezione di byte alla fine, comunque.) Una volta che lo hai fatto, troverai la lunghezza con len.