Gin-Gonic 文件上传 mime 错误
Gin-Gonic File upload mime error
我正在创建一个 API 与 gin-gonic 包一起使用,但我被文件上传处理程序困住了。
这是我的代码:
func postPicture(c *gin.Context) {
id, ok := c.Params.Get("fileId")
if !ok {...} // Err Handling
user, ok := c.Params.Get("user")
if !ok {...} // Err Handling
file, _, err := c.Request.FormFile("file") // Here is the bug
if err != nil {
Common.Debug("Error: " + err.Error())
c.JSON(http.StatusBadRequest, Common.JsonError{"Error", err.Error()})
return
} // Err Handling
path := "./Files/" + user + "/pictures"
filename := id + ".jpg"
if _, err := os.Stat(path); os.IsNotExist(err) {
os.Mkdir(path, 0755)
}
out, err := os.Create(path + "/" + filename)
if err != nil {...} // Err Handling
defer out.Close()
_, err = io.Copy(out, file)
if err != nil {...} // Err Handling
c.JSON(http.StatusAccepted, gin.H{})
}
错误在 c.Request.FormFile() 上,它 returns 我 "mime: invalid media parameter" 无论请求是什么。我尝试了以下方法:
curl -X POST --form upload=C:\Users\meiche_j\Pictures\Capture.PNG -H "Content-Type: multipart/form-data;boundary=???" "http://127.0.0.1:3003/postFiles/picture/58cbb5627067500f58834f69/fileIdTest"
curl -X POST --form upload=C:\Users\meiche_j\Pictures\Capture.PNG -H "Content-Type: multipart/form-data;boundary=???;Content-Disposition: attachment; filename=file" "http://127.0.0.1:3003/postFiles/picture/58cbb5627067500f58834f69/fileIdTest"
curl -X POST --form upload=C:\Users\meiche_j\Pictures\Capture.PNG -H "Content-Type: multipart/form-data;boundary=???;Content-Disposition: form-data; filename=file" "http://127.0.0.1:3003/postFiles/picture/58cbb5627067500f58834f69/fileIdTest"
我不认为错误出在代码中,但我找不到缺少什么请求 headers,知道吗?
您在代码和测试中犯了多个小错误:
您应该在 c.Request.FormFile("file")
中使用正确的密钥,这里您使用 file
作为密钥,但您在 curl 请求中使用 upload
作为密钥 --form upload=...
你应该在你的 curl 请求中使用 @
: curl -X POST --form upload=@C:\Users\meiche_j\Pictures\Capture.PNG
表示你想传输文件的内容而不仅仅是路径
你应该避免在你的 curl 请求中自己放置 boundary 参数,而像
这样的 curl 请求
curl -X POST -F upload=@pathtoyourfile -H 'Content-Type: multipart/form-data' "http://127.0.0.1:3003/postFiles/picture/58cbb5627067500f58834f69/fileIdTest"
希望这有用
我正在创建一个 API 与 gin-gonic 包一起使用,但我被文件上传处理程序困住了。 这是我的代码:
func postPicture(c *gin.Context) {
id, ok := c.Params.Get("fileId")
if !ok {...} // Err Handling
user, ok := c.Params.Get("user")
if !ok {...} // Err Handling
file, _, err := c.Request.FormFile("file") // Here is the bug
if err != nil {
Common.Debug("Error: " + err.Error())
c.JSON(http.StatusBadRequest, Common.JsonError{"Error", err.Error()})
return
} // Err Handling
path := "./Files/" + user + "/pictures"
filename := id + ".jpg"
if _, err := os.Stat(path); os.IsNotExist(err) {
os.Mkdir(path, 0755)
}
out, err := os.Create(path + "/" + filename)
if err != nil {...} // Err Handling
defer out.Close()
_, err = io.Copy(out, file)
if err != nil {...} // Err Handling
c.JSON(http.StatusAccepted, gin.H{})
}
错误在 c.Request.FormFile() 上,它 returns 我 "mime: invalid media parameter" 无论请求是什么。我尝试了以下方法:
curl -X POST --form upload=C:\Users\meiche_j\Pictures\Capture.PNG -H "Content-Type: multipart/form-data;boundary=???" "http://127.0.0.1:3003/postFiles/picture/58cbb5627067500f58834f69/fileIdTest"
curl -X POST --form upload=C:\Users\meiche_j\Pictures\Capture.PNG -H "Content-Type: multipart/form-data;boundary=???;Content-Disposition: attachment; filename=file" "http://127.0.0.1:3003/postFiles/picture/58cbb5627067500f58834f69/fileIdTest"
curl -X POST --form upload=C:\Users\meiche_j\Pictures\Capture.PNG -H "Content-Type: multipart/form-data;boundary=???;Content-Disposition: form-data; filename=file" "http://127.0.0.1:3003/postFiles/picture/58cbb5627067500f58834f69/fileIdTest"
我不认为错误出在代码中,但我找不到缺少什么请求 headers,知道吗?
您在代码和测试中犯了多个小错误:
您应该在
c.Request.FormFile("file")
中使用正确的密钥,这里您使用file
作为密钥,但您在 curl 请求中使用upload
作为密钥--form upload=...
你应该在你的 curl 请求中使用
@
:curl -X POST --form upload=@C:\Users\meiche_j\Pictures\Capture.PNG
表示你想传输文件的内容而不仅仅是路径你应该避免在你的 curl 请求中自己放置 boundary 参数,而像
这样的 curl 请求curl -X POST -F upload=@pathtoyourfile -H 'Content-Type: multipart/form-data' "http://127.0.0.1:3003/postFiles/picture/58cbb5627067500f58834f69/fileIdTest"
希望这有用