diff --git a/storage/minio.go b/storage/minio.go index 21adf50..4eb3a83 100644 --- a/storage/minio.go +++ b/storage/minio.go @@ -63,9 +63,13 @@ func (s *Minio) Put(fileName, objectName string, onProcess func(fsize, uploaded objectName = strings.TrimLeft(objectName, "/ ") ext := strings.TrimLeft(path.Ext(fileName), ".") + contentType := ext2ContentType(ext) + if contentType == "" { + contentType = detectContentType(fileName) + } _, err := s.client.FPutObjectWithContext(ctx, s.config.Bucket, objectName, fileName, - minio.PutObjectOptions{ContentType: ext2ContentType(ext)}) + minio.PutObjectOptions{ContentType: contentType}) if err != nil { log.Errorf("upload file to minio error:%s", err.Error()) return err diff --git a/storage/util.go b/storage/util.go index c749723..a99f44f 100644 --- a/storage/util.go +++ b/storage/util.go @@ -115,6 +115,24 @@ func ext2ContentType(ext string) string { } } +// detectContentType 从文件内容检测 MIME 类型 +func detectContentType(filePath string) string { + f, err := os.Open(filePath) + if err != nil { + return "" + } + defer f.Close() + + // 读取前 512 字节用于检测 + buf := make([]byte, 512) + n, err := f.Read(buf) + if err != nil && err != io.EOF { + return "" + } + + return http.DetectContentType(buf[:n]) +} + func Download(url, path string) error { f, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) stat, err := f.Stat()