// getMimeFromMagic accepts a sample and counter and then tries to determin the // mime type of the file. If a panic occures in an external library the function // will recover and try to get the mime type up to three times before returning // "N/A" as mime type. func getMimeFromMagic(fileBytes []byte, try int) (mimeType string, err error) { defer func() { magicmime.Close() mimeLock.Unlock() if err := recover(); err != nil { warning.Println("magicMime paniced") time.Sleep(time.Second) mimeType, err = getMimeFromMagic(fileBytes, try+1) } }() // if we tried to get the mimeType 3 times but paniced we'll return a // static string if try >= 3 { err = nil mimeType = "N/A" return } mimeLock.Lock() err = magicmime.Open(magicmime.MAGIC_ERROR) if err != nil { err = errors.New("ExtendedMime is activated but libmagic is not installed!") return } mimeType, err = magicmime.TypeByBuffer(fileBytes) return }
// GetMimetype gets the mimetype of a data []byte func GetMimetype(data []byte) (string, error) { if err := magicmime.Open(magicmime.MAGIC_NO_CHECK_COMPRESS); err != nil { return "", err } defer magicmime.Close() mimetype, err := magicmime.TypeByBuffer(data) if err != nil { return "", err } return mimetype, nil }