fix: 修复Alpine上MIME类型检测失败

- fallbackMimeTypes 硬编码映射优先,不依赖系统 mime.types
- Docker 镜像安装 mailcap 包提供 /etc/mime.types
- 移除不可靠的 mime.AddExtensionType 方案
This commit is contained in:
2026-05-05 19:58:56 +08:00
parent 041eeaf34b
commit 92813fde49
2 changed files with 32 additions and 19 deletions
+1 -1
View File
@@ -33,7 +33,7 @@ RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main ./cmd/main.g
FROM alpine:latest FROM alpine:latest
RUN apk --no-cache add ca-certificates tzdata su-exec RUN apk --no-cache add ca-certificates tzdata su-exec mailcap
RUN addgroup -g 1001 -S appgroup && \ RUN addgroup -g 1001 -S appgroup && \
adduser -u 1001 -S appuser -G appgroup adduser -u 1001 -S appuser -G appgroup
+31 -18
View File
@@ -6,7 +6,6 @@ import (
"fmt" "fmt"
"io/fs" "io/fs"
"log" "log"
"mime"
"net/url" "net/url"
"os" "os"
"strings" "strings"
@@ -226,15 +225,6 @@ func startServer() {
r := gin.Default() r := gin.Default()
r.MaxMultipartMemory = 32 << 20 r.MaxMultipartMemory = 32 << 20
mime.AddExtensionType(".js", "application/javascript; charset=utf-8")
mime.AddExtensionType(".mjs", "application/javascript; charset=utf-8")
mime.AddExtensionType(".css", "text/css; charset=utf-8")
mime.AddExtensionType(".html", "text/html; charset=utf-8")
mime.AddExtensionType(".json", "application/json; charset=utf-8")
mime.AddExtensionType(".svg", "image/svg+xml")
mime.AddExtensionType(".woff", "font/woff")
mime.AddExtensionType(".woff2", "font/woff2")
r.Use(middleware.Logger()) r.Use(middleware.Logger())
r.Use(middleware.Recovery()) r.Use(middleware.Recovery())
r.Use(middleware.Cors()) r.Use(middleware.Cors())
@@ -284,10 +274,7 @@ func setupEmbeddedFrontend(r *gin.Engine) {
return return
} }
contentType := mime.TypeByExtension(decodedPath) contentType := getContentTypeByExtension(decodedPath)
if contentType == "" {
contentType = "application/octet-stream"
}
c.Header("Cache-Control", "public, max-age=31536000, immutable") c.Header("Cache-Control", "public, max-age=31536000, immutable")
c.Data(200, contentType, data) c.Data(200, contentType, data)
@@ -305,10 +292,7 @@ func setupEmbeddedFrontend(r *gin.Engine) {
decodedPath = path decodedPath = path
} }
if data, err := fs.ReadFile(distFS, decodedPath); err == nil { if data, err := fs.ReadFile(distFS, decodedPath); err == nil {
contentType := mime.TypeByExtension(decodedPath) contentType := getContentTypeByExtension(decodedPath)
if contentType == "" {
contentType = "application/octet-stream"
}
c.Data(200, contentType, data) c.Data(200, contentType, data)
return return
} }
@@ -343,6 +327,35 @@ func serveIndexHTML(c *gin.Context, indexHTML string) {
c.Data(200, "text/html; charset=utf-8", []byte(html)) c.Data(200, "text/html; charset=utf-8", []byte(html))
} }
var fallbackMimeTypes = map[string]string{
".js": "application/javascript; charset=utf-8",
".mjs": "application/javascript; charset=utf-8",
".css": "text/css; charset=utf-8",
".html": "text/html; charset=utf-8",
".json": "application/json; charset=utf-8",
".svg": "image/svg+xml",
".png": "image/png",
".jpg": "image/jpeg",
".jpeg": "image/jpeg",
".gif": "image/gif",
".ico": "image/x-icon",
".webp": "image/webp",
".woff": "font/woff",
".woff2": "font/woff2",
".ttf": "font/ttf",
".eot": "application/vnd.ms-fontobject",
".xml": "application/xml",
".txt": "text/plain; charset=utf-8",
}
func getContentTypeByExtension(filename string) string {
ext := strings.ToLower(filename[strings.LastIndex(filename, "."):])
if ct, ok := fallbackMimeTypes[ext]; ok {
return ct
}
return "application/octet-stream"
}
func getSettingString(settings map[string]interface{}, key, defaultValue string) string { func getSettingString(settings map[string]interface{}, key, defaultValue string) string {
if val, ok := settings[key]; ok { if val, ok := settings[key]; ok {
if str, ok := val.(string); ok && str != "" { if str, ok := val.(string); ok && str != "" {