| package utils | |
| import ( | |
| "fmt" | |
| "net/url" | |
| "strings" | |
| ) | |
| // GenerateContentDisposition 生成符合RFC 5987标准的Content-Disposition头部 | |
| func GenerateContentDisposition(fileName string) string { | |
| // 按照RFC 2047进行编码,用于filename部分 | |
| encodedName := urlEncode(fileName) | |
| // 按照RFC 5987进行编码,用于filename*部分 | |
| encodedNameRFC5987 := encodeRFC5987(fileName) | |
| return fmt.Sprintf("attachment; filename=\"%s\"; filename*=utf-8''%s", | |
| encodedName, encodedNameRFC5987) | |
| } | |
| // encodeRFC5987 按照RFC 5987规范编码字符串,适用于HTTP头部参数中的非ASCII字符 | |
| func encodeRFC5987(s string) string { | |
| var buf strings.Builder | |
| for _, r := range []byte(s) { | |
| // 根据RFC 5987,只有字母、数字和部分特殊符号可以不编码 | |
| if (r >= 'a' && r <= 'z') || | |
| (r >= 'A' && r <= 'Z') || | |
| (r >= '0' && r <= '9') || | |
| r == '-' || r == '.' || r == '_' || r == '~' { | |
| buf.WriteByte(r) | |
| } else { | |
| // 其他字符都需要百分号编码 | |
| fmt.Fprintf(&buf, "%%%02X", r) | |
| } | |
| } | |
| return buf.String() | |
| } | |
| func urlEncode(s string) string { | |
| s = url.QueryEscape(s) | |
| s = strings.ReplaceAll(s, "+", "%20") | |
| return s | |
| } | |