2013-06-16 7 views
6

Wenn ein Benutzer eine Datei hochlädt, mit r.FormFile ("Datei") erhalten Sie eine multipart.File, eine multipart.FileHeader und einen Fehler.golang - So überprüfen Sie multipart.File Informationen

Meine Frage ist, wie man nur Informationen über die hochgeladene Datei erhält, zum Beispiel Größe, und wenn es ein Bild ist, ist es Dimensions, und so weiter und so fort.

Ich habe buchstäblich keine Ahnung, wo ich anfangen soll, also wäre jede Hilfe großartig.

Antwort

4

Der Dateiname und MIME-Typ können aus der zurückgegebenen multipart.FileHeader abgerufen werden.

Die meisten weiteren Metadaten hängen vom Dateityp ab. Wenn es sich um ein Bild handelt, sollten Sie die DecodeConfig-Funktionen in der Standardbibliothek für PNG, JPEG und GIF verwenden können, um die Abmessungen (und das Farbmodell) zu erhalten.

Es gibt viele Go-Bibliotheken für andere Dateitypen, die ähnliche Funktionen haben.

EDIT: Es gibt ein gutes Beispiel für die golang-nuts mail group.

+0

Danke für das, meistens was ich gesucht habe. Wie würdest du die Größe (kb, mb weise) der Datei herausfinden, während du die Datei für die spätere Verwendung live hältst? – user81779

+1

In dem verknüpften 'golang-nuts'-Post verwendet das Beispiel die' ioutil.ReadAll'-Funktion, die wirklich eine Komfortfunktion ist. Für eine bessere Steuerung würden Sie die Funktion "io.ReadFull" verwenden, die die Anzahl der gelesenen Bytes zurückgibt. Siehe http://golang.org/pkg/io/ioutil/#ReadAll und http://golang.org/pkg/io/#ReadFull – Intermernet

2

Sie können ungefähre Informationen über die Größe der Datei von Content-Length Header erhalten. Dies wird nicht empfohlen, da dieser Header geändert werden kann.

Ein besserer Weg ist ReadFrom Methode zu verwenden:

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

Um die Dateigröße und MIME-Typ zu erhalten:

// 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)) 
} 

Beispielausgabe:

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" 
Verwandte Themen