fix: 用硬编码MIME映射替代mime.TypeByExtension

- Alpine镜像缺少/etc/mime.types导致TypeByExtension不可靠
- 使用getContentType函数硬编码常见Web文件MIME类型
- 不再依赖系统环境,确保所有平台行为一致
This commit is contained in:
2026-05-05 04:12:12 +08:00
parent a1e3306fc7
commit bb802e765c
2 changed files with 126 additions and 354 deletions
+42 -18
View File
@@ -5,7 +5,6 @@ import (
"fmt"
"io/fs"
"log"
"mime"
"net/url"
"os"
"strings"
@@ -225,15 +224,6 @@ func startServer() {
r := gin.Default()
r.MaxMultipartMemory = 32 << 20
mime.AddExtensionType(".js", "application/javascript")
mime.AddExtensionType(".mjs", "application/javascript")
mime.AddExtensionType(".css", "text/css")
mime.AddExtensionType(".html", "text/html")
mime.AddExtensionType(".json", "application/json")
mime.AddExtensionType(".svg", "image/svg+xml")
mime.AddExtensionType(".woff", "font/woff")
mime.AddExtensionType(".woff2", "font/woff2")
r.Use(middleware.Logger())
r.Use(middleware.Recovery())
r.Use(middleware.Cors())
@@ -282,10 +272,7 @@ func setupEmbeddedFrontend(r *gin.Engine) {
return
}
contentType := mime.TypeByExtension(decodedPath)
if contentType == "" {
contentType = "application/octet-stream"
}
contentType := getContentType(decodedPath)
c.Header("Cache-Control", "public, max-age=31536000, immutable")
c.Data(200, contentType, data)
@@ -303,10 +290,7 @@ func setupEmbeddedFrontend(r *gin.Engine) {
decodedPath = path
}
if data, err := fs.ReadFile(distFS, decodedPath); err == nil {
contentType := mime.TypeByExtension(decodedPath)
if contentType == "" {
contentType = "application/octet-stream"
}
contentType := getContentType(decodedPath)
c.Data(200, contentType, data)
return
}
@@ -349,3 +333,43 @@ func getSettingString(settings map[string]interface{}, key, defaultValue string)
}
return defaultValue
}
func getContentType(filename string) string {
ext := strings.ToLower(filename[strings.LastIndex(filename, "."):])
switch ext {
case ".js", ".mjs":
return "application/javascript; charset=utf-8"
case ".css":
return "text/css; charset=utf-8"
case ".html":
return "text/html; charset=utf-8"
case ".json":
return "application/json; charset=utf-8"
case ".png":
return "image/png"
case ".jpg", ".jpeg":
return "image/jpeg"
case ".gif":
return "image/gif"
case ".svg":
return "image/svg+xml"
case ".ico":
return "image/x-icon"
case ".webp":
return "image/webp"
case ".woff":
return "font/woff"
case ".woff2":
return "font/woff2"
case ".ttf":
return "font/ttf"
case ".eot":
return "application/vnd.ms-fontobject"
case ".xml":
return "application/xml"
case ".txt":
return "text/plain; charset=utf-8"
default:
return "application/octet-stream"
}
}