You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)
}

额外排查点

  1. 文件系统编码验证:若运行环境是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
}
  1. 浏览器测试:不同浏览器对Content-Disposition的解析可能有差异,优先测试Chrome、Firefox等现代浏览器,确认是否优先读取filename*字段。
  2. Gin版本验证:确保使用的Gin版本(如1.8.1)的FileAttachment方法无BUG,若仍有问题,可直接用上述手动构造响应头的方式替代内置方法。

内容的提问来源于stack exchange,提问作者ujlee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 07:40:33