Go语言中SVG文件MIME类型识别错误问题求助
解决SVG文件MIME类型识别错误的问题
http.DetectContentType是通过文件头的二进制魔法数来识别MIME类型的,但SVG是纯文本格式,没有独特的二进制特征,开头的<svg文本和普通文本文件特征重叠,因此会被识别为text/plain。你可以通过以下两种方式修正这个问题:
方法一:结合文件扩展名判断
利用Linux系统中文件后缀的约定,直接为.svg后缀的文件指定正确的MIME类型,其他文件仍使用原有的检测逻辑:
package main import ( "encoding/base64" "fmt" "net/http" "os" "path/filepath" "strings" ) func main() { filePath := os.Args[len(os.Args)-1] fileBytes, err := os.ReadFile(filePath) if err != nil { fmt.Printf("读取文件失败: %v\n", err) os.Exit(1) } // 优先通过扩展名识别SVG ext := strings.ToLower(filepath.Ext(filePath)) var mimeType string if ext == ".svg" { mimeType = "image/svg+xml" } else { fileDetails := http.DetectContentType(fileBytes) mimeType = strings.Split(fileDetails, ";")[0] } base64Str := base64.StdEncoding.EncodeToString(fileBytes) fmt.Print("data:" + mimeType + ";base64," + base64Str) }
方法二:检查文件内容开头
如果担心扩展名不准确,可以直接检查文件内容的开头是否包含SVG的标志性标签(忽略前导空白和大小写):
package main import ( "encoding/base64" "fmt" "net/http" "os" "strings" "unicode" ) func main() { filePath := os.Args[len(os.Args)-1] fileBytes, err := os.ReadFile(filePath) if err != nil { fmt.Printf("读取文件失败: %v\n", err) os.Exit(1) } var mimeType string // 检查内容开头是否为SVG标签(忽略前导空白和大小写) contentStr := strings.TrimLeftFunc(string(fileBytes), unicode.IsSpace) if strings.HasPrefix(strings.ToLower(contentStr), "<svg") { mimeType = "image/svg+xml" } else { fileDetails := http.DetectContentType(fileBytes) mimeType = strings.Split(fileDetails, ";")[0] } base64Str := base64.StdEncoding.EncodeToString(fileBytes) fmt.Print("data:" + mimeType + ";base64," + base64Str) }
你也可以将两种方法结合使用(先检查扩展名,再验证内容),进一步提升识别的准确性。另外,原代码忽略了文件读取的错误,建议保留错误处理逻辑避免程序意外崩溃。
内容的提问来源于stack exchange,提问作者Abid Hasan
相关产品推荐
相关产品推荐

