去除表单数据中前缀的文件名

我将文件从 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 但我的服务器正在将 multipart-form 读取到以下结构:


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


繁花如伊
浏览 336回答 1
1回答

慕容708150

该目录在 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() 通过直接解析内容处置标头。for _, fileHeader := range r.MultipartForm.File["files"] {&nbsp; &nbsp; _, params, _ := mime.ParseMediaType(fileHeader.Header.Get("Content-Disposition"))&nbsp; &nbsp; filename := params["filename"]&nbsp; &nbsp; if filename == "" {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// TODO: Handle unexpected content disposition&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// header (missing header, parse error, missing param).&nbsp; &nbsp; }
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go