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.