docker-compose.yml中添加挂载:
volumes:
- /etc/mime.types:/etc/mime.types # 用于处理文件后缀
原因:
docker 容器中缺少文件后缀到Content-Type的定义,也就是/etc/mime.types中的内容。以下是go 1.17 的源码
// F:/Program Files/Go/src/mime/type.go:111
// 根据后缀名获取 Content-Type
func TypeByExtension(ext string) string {
once.Do(initMime)
// Case-sensitive lookup.
if v, ok := mimeTypes.Load(ext); ok {
return v.(string)
}
......
}
// F:/Program Files/Go/src/mime/type.go:83
// 程序启动初始化类型列表
func initMime() {
if fn := testInitMime; fn != nil {
fn()
} else {
setMimeTypes(builtinTypesLower, builtinTypesLower)
osInitMime()
}
}
// unix 系统的初始化方法
func init() {
osInitMime = initMimeUnix
}
// F:/Program Files/Go/src/mime/type_unix.go:94
func initMimeUnix() {
for _, filename := range mimeGlobs {
if err := loadMimeGlobsFile(filename); err == nil {
return // Stop checking more files if mimetype database is found.
}
}
// Fallback if no system-generated mimetype database exists.
for _, filename := range typeFiles {
loadMimeFile(filename)
}
}
// Common locations for mime.types files on unix.
var typeFiles = []string{
"/etc/mime.types",
"/etc/apache2/mime.types",
"/etc/apache/mime.types",
"/etc/httpd/conf/mime.types",
}
使用场景
使用golang做一个下载文件功能,使用 docker 部署时发现 docx 文件不能正确识别,被识别成 zip 了。本地通过传入文件名就可以识别 docx 但是 docker部署的仍然不行。
func main() {
route := gin.Default()
route.GET("/file/*filepath", GetFile)
server := http.Server{
Addr: ":8080",
Handler: route,
ReadTimeout: 10 * time.Second,
WriteTimeout: 10 * time.Second,
MaxHeaderBytes: http.DefaultMaxHeaderBytes,
}
err := server.ListenAndServe()
if err != nil {
fmt.Println(err)
}
}
func GetFile(c *gin.Context) {
//file := c.Param("filepath")
name := c.Query("name")
data, err := base64.StdEncoding.DecodeString(fileDocx) // fileDocx是一个文件的base64内容
if err != nil {
fmt.Println(err)
}
http.ServeContent(c.Writer, c.Request, name, time.Now(), bytes.NewReader(data))
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)