2013-06-16 10 views
6

Quando un utente carica un file, utilizzando r.FormFile ("file") si ottiene un file multipart.File, multipart.FileHeader e un errore.golang - Come verificare multipart.File informazioni

La mia domanda è come ottenere semplicemente informazioni sul file caricato, ad esempio, la sua dimensione, e se si tratta di un'immagine è demension, e così via e così via.

Non ho davvero idea di dove cominciare, quindi qualsiasi aiuto sarebbe fantastico.

risposta

4

Il nome del file e il tipo MIME possono essere ottenuti dal reso multipart.FileHeader.

La maggior parte dei metadati dipendono dal tipo di file. Se si tratta di un'immagine, dovresti essere in grado di utilizzare le funzioni DecodeConfig nella libreria standard, per PNG, JPEG e GIF, per ottenere le dimensioni (e il modello di colore).

Ci sono molte librerie Go disponibili anche per altri tipi di file, che avranno funzioni simili.

MODIFICA: C'è un buon esempio su golang-nuts mail group.

+0

Grazie per questo, soprattutto quello che stavo cercando. Come faresti a scoprire la dimensione (kb, mb saggio) del file, mantenendo il file live per un uso successivo? – user81779

+1

Nel post 'golang-nuts' collegato, l'esempio usa la funzione' ioutil.ReadAll' che è davvero una funzione di convenienza. Per un maggiore controllo si usa la funzione 'io.ReadFull' che restituisce il numero di byte letti. Vedi http://golang.org/pkg/io/ioutil/#ReadAll e http://golang.org/pkg/io/#ReadFull – Intermernet

2

È possibile ottenere informazioni approssimative sulla dimensione del file dall'intestazione Content-Length. Questo non è raccomandato, perché questa intestazione può essere cambiata.

Un modo migliore è quello di utilizzare ReadFrom metodo:

clientFile, handler, err := r.FormFile("file") // r is *http.Request 
var buff bytes.Buffer 
fileSize, err := buff.ReadFrom(clientFile) 
fmt.Println(fileSize) // this will return you a file size. 
3

Per ottenere la dimensione del file e MIME tipo:

// Size constants 
const (
     MB = 1 << 20 
) 

type Sizer interface { 
     Size() int64 
} 

func Sample(w http.ResponseWriter, r *http.Request) error { 
     if err := r.ParseMultipartForm(5 * MB); err != nil { 
       return err 
     } 

     // Limit upload size 
     r.Body = http.MaxBytesReader(w, r.Body, 5*MB) // 5 Mb 

     // 
     file, multipartFileHeader, err := r.FormFile("file") 

     // Create a buffer to store the header of the file in 
     fileHeader := make([]byte, 512) 

     // Copy the headers into the FileHeader buffer 
     if _, err := file.Read(fileHeader); err != nil { 
       return err 
     } 

     // set position back to start. 
     if _, err := file.Seek(0, 0); err != nil { 
       return err 
     } 

     log.Printf("Name: %#v\n", multipartFileHeader.Filename) 
     log.Printf("Size: %#v\n", file.(Sizer).Size()) 
     log.Printf("MIME: %#v\n", http.DetectContentType(fileHeader)) 
} 

Esempio di output:

2016/12/01 15:00:06 Name: "logo_35x30_black.png" 
2016/12/01 15:00:06 Size: 18674 
2016/12/01 15:00:06 MIME: "image/png"