2013-06-16 34 views
6

Khi người dùng tải lên tệp, sử dụng r.FormFile ("tệp"), bạn sẽ nhận được một multipart.File, một multipart.FileHeader và một lỗi.golang - Cách kiểm tra thông tin multipart.File

Câu hỏi của tôi là cách lấy thông tin về tệp đã tải lên chẳng hạn, kích thước của nó và nếu đó là hình ảnh thì đó là số liệu thống kê, v.v ...

Tôi thực sự không có ý tưởng về nơi bắt đầu để mọi trợ giúp đều tuyệt vời.

Trả lời

4

Tên tệp và loại MIME có thể lấy từ số multipart.FileHeader trả về.

Hầu hết các siêu dữ liệu bổ sung sẽ phụ thuộc vào loại tệp. Nếu đó là hình ảnh, bạn sẽ có thể sử dụng các chức năng DecodeConfig trong thư viện chuẩn, cho PNG, JPEGGIF, để có được thứ nguyên (và kiểu màu).

Có rất nhiều thư viện Go khả dụng cho các loại tệp khác, sẽ có các chức năng tương tự.

EDIT: Có một ví dụ tốt trên golang-nuts mail group.

+0

Cảm ơn bạn vì điều đó, chủ yếu là những gì tôi đang tìm kiếm. Làm thế nào bạn sẽ tìm ra kích thước (kb, mb khôn ngoan) của tập tin mặc dù, trong khi vẫn giữ tập tin trực tiếp để sử dụng sau này? – user81779

+1

Trong bài liên kết 'golang-nuts', ví dụ sử dụng hàm' ioutil.ReadAll' thực sự là một hàm tiện lợi. Để kiểm soát tốt hơn, bạn sẽ sử dụng hàm 'io.ReadFull' trả về số byte đã đọc. Xem http://golang.org/pkg/io/ioutil/#ReadAll và http://golang.org/pkg/io/#ReadFull – Intermernet

2

Bạn có thể nhận thông tin gần đúng về kích thước tệp từ tiêu đề Content-Length. Điều này không được khuyến khích, bởi vì tiêu đề này có thể được thay đổi.

Cách tốt hơn là sử dụng ReadFrom phương pháp:

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

Để có được kích thước tập tin và MIME type:

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

Mẫu đầu ra:

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" 
Các vấn đề liên quan