Gin框架文件下载API韩文文件名乱码问题求助
解决Gin框架韩文文件名下载乱码问题
针对你遇到的韩文文件名(如AWS자산.svg)下载乱码问题,可通过构造兼容新旧浏览器的Content-Disposition响应头解决,以下是具体实现方案:
核心思路
同时提供两种格式的文件名声明:
filename:兼容不支持RFC5987的旧浏览器(若字符不在ISO-8859-1范围内会显示问号,但不影响现代浏览器解析)filename*:遵循RFC5987标准,使用UTF-8编码的URL转义格式,现代浏览器会优先解析该字段
具体代码实现
import ( "fmt" "net/url" "github.com/gin-gonic/gin" ) func DownloadKoreanFile(c *gin.Context) { // 本地文件路径 filePath := "./AWS자산.svg" // 原始韩文文件名 originalFileName := "AWS자산.svg" // 对文件名进行URL编码(用于filename*字段) encodedFileName := url.QueryEscape(originalFileName) // 构造兼容的Content-Disposition头 c.Header("Content-Disposition", fmt.Sprintf( `attachment; filename="%s"; filename*=UTF-8''%s`, originalFileName, encodedFileName, )) // 设置正确的文件MIME类型(SVG示例) c.Header("Content-Type", "image/svg+xml") // 发送文件到客户端 c.File(filePath) }
额外排查点
- 文件系统编码验证:若运行环境是Windows,需确认文件系统中的文件名编码是否为UTF-8。如果是GBK编码,需先转码为UTF-8:
import ( "io" "golang.org/x/text/encoding/simplifiedchinese" "golang.org/x/text/transform" "strings" ) // 将GBK编码的文件名转为UTF-8 func gbkToUtf8(gbkStr string) (string, error) { reader := transform.NewReader(strings.NewReader(gbkStr), simplifiedchinese.GBK.NewDecoder()) utf8Str, err := io.ReadAll(reader) if err != nil { return "", err } return string(utf8Str), nil }
- 浏览器测试:不同浏览器对Content-Disposition的解析可能有差异,优先测试Chrome、Firefox等现代浏览器,确认是否优先读取
filename*字段。 - Gin版本验证:确保使用的Gin版本(如1.8.1)的
FileAttachment方法无BUG,若仍有问题,可直接用上述手动构造响应头的方式替代内置方法。
内容的提问来源于stack exchange,提问作者ujlee
相关产品推荐
相关产品推荐

