文件名在表单数据中去掉了前缀
Filename stripped of prefix in form data
我正在从 js 发送文件到我的 golang 服务器:
for (var value of formData.values()) {
console.log(value);
}
// File {name: 'img/<hash_key>.png', lastModified: 1635043863231, lastModifiedDate: Sat Oct 23 2021 23:51:03 GMT-0300 (Brasilia Standard Time), webkitRelativePath: '', size: 969, …}
// ...
var request = new Request( serverEndpoint, { body: formData, method: "POST", ... })
return fetch(request).then(response => { ... })
在我的 golang 服务器中,我使用以下代码处理来自读取文件请求的多部分表单数据
if err := r.ParseMultipartForm(32 << 20); err != nil {
...
}
for _, fileHeader := range r.MultipartForm.File["files"] {
...
}
我希望用相同的文件名读取 Go 中的文件,例如 img/<hash_key>.png
但是我的服务器正在读取以下结构的多部分形式:
f = {*mime/multipart.Form | 0xc000426090}
├── Value = {map[string][]string}
└── File = {map[string][]*mime/multipart.FileHeader}
├── 0 = files -> len:1, cap:1
│ ├── key = {string} "files"
│ └── value = {[]*mime/multipart.FileHeader} len:1, cap:1
│ └── 0 = {*mime/multipart.FileHeader | 0xc000440000}
│ ├── Filename = {string} "<hash_key>.png" // notice how FileName is missing 'img/' prefix
│ └── ...
└── ...
我想弄清楚这是怎么发生的以及如何防止这个带前缀,因为我需要这个前缀来正确解析我的文件的上传路径
编辑:
仔细检查发现我的服务器实际上正在获取名称正确的文件。调用 r.ParseMultipartForm(32 << 20)
后,我在 r.Body.src.R.buf
中得到以下内容:
------WebKitFormBoundary1uanPdXqZeL8IPUH
Content-Disposition: form-data; name="files"; filename="img/upload.svg"
---- notice the img/ prefix
Content-Type: image/svg+xml
<svg height="512pt" viewBox= ...
但是在r.MultipartForm.File["files"][0].FileName
中显示为upload.svg
目录在in Part.FileName()中删除:
// RFC 7578, Section 4.2 requires that if a filename is provided, the
// directory path information must not be used.
return filepath.Base(filename)
解决方法 Part.FileName() 直接解析内容配置 header。
for _, fileHeader := range r.MultipartForm.File["files"] {
_, params, _ := mime.ParseMediaType(fileHeader.Header.Get("Content-Disposition"))
filename := params["filename"]
if filename == "" {
// TODO: Handle unexpected content disposition
// header (missing header, parse error, missing param).
}
我正在从 js 发送文件到我的 golang 服务器:
for (var value of formData.values()) {
console.log(value);
}
// File {name: 'img/<hash_key>.png', lastModified: 1635043863231, lastModifiedDate: Sat Oct 23 2021 23:51:03 GMT-0300 (Brasilia Standard Time), webkitRelativePath: '', size: 969, …}
// ...
var request = new Request( serverEndpoint, { body: formData, method: "POST", ... })
return fetch(request).then(response => { ... })
在我的 golang 服务器中,我使用以下代码处理来自读取文件请求的多部分表单数据
if err := r.ParseMultipartForm(32 << 20); err != nil {
...
}
for _, fileHeader := range r.MultipartForm.File["files"] {
...
}
我希望用相同的文件名读取 Go 中的文件,例如 img/<hash_key>.png
但是我的服务器正在读取以下结构的多部分形式:
f = {*mime/multipart.Form | 0xc000426090}
├── Value = {map[string][]string}
└── File = {map[string][]*mime/multipart.FileHeader}
├── 0 = files -> len:1, cap:1
│ ├── key = {string} "files"
│ └── value = {[]*mime/multipart.FileHeader} len:1, cap:1
│ └── 0 = {*mime/multipart.FileHeader | 0xc000440000}
│ ├── Filename = {string} "<hash_key>.png" // notice how FileName is missing 'img/' prefix
│ └── ...
└── ...
我想弄清楚这是怎么发生的以及如何防止这个带前缀,因为我需要这个前缀来正确解析我的文件的上传路径
编辑:
仔细检查发现我的服务器实际上正在获取名称正确的文件。调用 r.ParseMultipartForm(32 << 20)
后,我在 r.Body.src.R.buf
中得到以下内容:
------WebKitFormBoundary1uanPdXqZeL8IPUH
Content-Disposition: form-data; name="files"; filename="img/upload.svg"
---- notice the img/ prefix
Content-Type: image/svg+xml
<svg height="512pt" viewBox= ...
但是在r.MultipartForm.File["files"][0].FileName
中显示为upload.svg
目录在in Part.FileName()中删除:
// RFC 7578, Section 4.2 requires that if a filename is provided, the
// directory path information must not be used.
return filepath.Base(filename)
解决方法 Part.FileName() 直接解析内容配置 header。
for _, fileHeader := range r.MultipartForm.File["files"] {
_, params, _ := mime.ParseMediaType(fileHeader.Header.Get("Content-Disposition"))
filename := params["filename"]
if filename == "" {
// TODO: Handle unexpected content disposition
// header (missing header, parse error, missing param).
}