fix: 修复Alpine上MIME类型检测失败
- fallbackMimeTypes 硬编码映射优先,不依赖系统 mime.types - Docker 镜像安装 mailcap 包提供 /etc/mime.types - 移除不可靠的 mime.AddExtensionType 方案
This commit is contained in:
+1
-1
@@ -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
@@ -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 != "" {
|
||||||
|
|||||||
Reference in New Issue
Block a user