golang - 如何检查multipart.File信息

use*_*779 9 file-upload go

当用户使用r.FormFile("file")上传文件时,您将获得multipart.File,multipart.FileHeader和错误.

我的问题是如何获取有关上传文件的信息,例如,它的大小,如果它是一个图像,它是demensions,依此类推.

我真的不知道从哪里开始所以任何帮助都会很棒.

Int*_*net 8

可以从返回的文件名和MIME类型中获取multipart.FileHeader.

大多数元数据将取决于文件类型.如果它是一个形象,你应该能够使用的DecodeConfig功能,在标准库,PNG,JPEGGIF,获得尺寸(和颜色模型).

有许多Go库可用于其他文件类型,它们具有类似的功能.

编辑:golang-nuts邮件组有一个很好的例子.


Jun*_*Xie 8

要获取文件大小和MIME类型:

// 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))
}
Run Code Online (Sandbox Code Playgroud)

样本输出:

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"
Run Code Online (Sandbox Code Playgroud)

  • 为什么使用 `file.(Sizer).Size()` 而不是 `multipartFileHeader.Size`? (2认同)