golang-Как проверить multipart.Информация о файле

когда пользователь загружает файл, используя r.FormFile ("файл") вы получаете составную часть.Файл, составной.FileHeader и ошибка.

мой вопрос в том, как просто получить информацию о загруженном файле, например, это размер, и если это изображение, это demensions, и так далее и тому подобное.

Я буквально понятия не имею, с чего начать, поэтому любая помощь будет отличной.

3 ответов


имя файла и тип MIME могут быть получены из возвращаемого multipart.FileHeader.

большинство дальнейших метаданных будет зависеть от типа файла. Если это изображение, вы должны иметь возможность использовать DecodeConfig функции в стандартной библиотеке PNG, JPEG и GIF, чтобы получить размеры (цвет и модель).

есть много библиотек Go, доступных для других типов файлов, а также, которые будут иметь схожая функция.

EDIT: есть хороший пример на golang-nuts почта.


чтобы получить размер файла и тип 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))
}

пример вывода:

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"

Вы можете получить приблизительную информацию о размере файла из Content-Length заголовок. Это не рекомендуется, так как этот заголовок можно изменить.

лучший способ-использовать ReadFrom способ:

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.