ai_scheduler/internal/data/constants/file.go

76 lines
1.7 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package constants
import (
"github.com/gabriel-vasile/mimetype"
"io"
"strings"
)
type FileType string
const (
FileTypeUnknown FileType = "unknown"
FileTypeImage FileType = "image"
//FileTypeVideo FileType = "video"
FileTypeExcel FileType = "excel"
FileTypeWord FileType = "word"
FileTypeTxt FileType = "txt"
FileTypePDF FileType = "pdf"
)
var FileTypeMappings = map[FileType][]string{
FileTypeImage: {
"image/jpeg", "image/png", "image/gif", "image/webp", "image/svg+xml",
".jpg", ".jpeg", ".png", ".gif", ".webp", ".svg",
},
FileTypeExcel: {
"application/vnd.ms-excel",
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
".xls", ".xlsx",
},
FileTypeWord: {
"application/msword",
"application/vnd.openxmlformats-officedocument.wordprocessingml.document",
".doc", ".docx",
},
FileTypePDF: {
"application/pdf",
".pdf",
},
FileTypeTxt: {
"text/plain",
".txt",
},
}
func DetectFileType(file io.ReadSeeker) (FileType, error) {
// 读取文件头512字节足够检测大多数类型
buffer := make([]byte, 512)
n, err := file.Read(buffer)
if err != nil && err != io.EOF {
return FileTypeUnknown, err
}
// 重置读取位置
if _, err := file.Seek(0, io.SeekStart); err != nil {
return FileTypeUnknown, err
}
// 检测 MIME 类型
detectedMIME := mimetype.Detect(buffer[:n]).String()
// 遍历映射表,匹配 MIME 或扩展名
for fileType, mimesOrExts := range FileTypeMappings {
for _, item := range mimesOrExts {
if strings.HasPrefix(item, ".") {
continue // 跳过扩展名(仅 MIME 检测)
}
if item == detectedMIME {
return fileType, nil
}
}
}
return FileTypeUnknown, nil
}