如何使用Curl同时发布文件和JSON数据?

问题描述 投票:0回答:5

我已经用这个curl命令发布了一个文件:

curl -i -F file=@./File.xlsm -F name=file -X POST http://example.com/new_file/

现在我想随文件一起发送有关该文件的一些信息(作为 JSON)。

curl -i -H "Content-Type: application/json" -d '{"metadata": {"comment": "Submitting a new data set.", "current": false }, "sheet": 1, "row": 7 }' -F file=@./File.xlsm -F name=file http://example.com/new_file/

Curl 对于以这种完全错误的方式使用非常生气,在这种情况下它会说“您只能选择一个 HTTP 请求!”好的,很公平,那么我如何将文件附件和那些 POST 变量放入单个curl HTTP 请求中?

json post file-upload curl curl-commandline
5个回答
23
投票

我已经成功开发了类似的端点,这些端点接受多个文件及其 JSON 格式的元数据。

curl -i -X POST -H "Content-Type: multipart/mixed" -F "blob=@/Users/username/Documents/bio.jpg" -F "metadata={\"edipi\":123456789,\"firstName\":\"John\",\"lastName\":\"Smith\",\"email\":\"[email protected]\"};type=application/json" http://localhost:8080/api/v1/user/

请注意在元数据请求部分末尾添加了

;type=application/json
。上传多个不同类型的文件时,可以在-F值末尾定义mime类型。

我已经确认这适用于使用 @RequestPart 的 Spring MVC 4.3.7。该实例的关键是不要在 @RequestMapping 注释上提供消耗值。


7
投票

您可以添加另一个表单字段:

curl -X POST http://someurl/someresource -F upload=@/path/to/some/file -F data="{\"test\":\"test\"}"

注意:由于内容类型的原因,这并不真正等同于将 json 发送到 Web 服务。


3
投票

这对我有用:

curl -v -H "Content-Type:multipart/form-data" -F "meta-data=@C:\Users\saurabh.sharma\Desktop\test.json;type=application/json" -F "file-data=@C:\Users\saurabh.sharma\Pictures\Saved Pictures\windows_70-wallpaper.jpg" http://localhost:7002/test/upload

test.json有我要发送的json数据。


0
投票

来自 @nbrooks 评论,添加额外的标头 HTTP 标头 可以正常工作,如下所示,通过在

curl
命令中使用多个 -H or --header 标志:


curl -H "comment: Submitting a new data set." -H  "current: false" -H "sheet: 1" -H "row: 7" -F file=@./File.xlsm -F name=file http://example.com/new_file/

comment
current
可以组合成 “元数据”
request.headers
Flask Web 服务器上的处理部分。


0
投票

我使用的解决方案是:

  1. 将标题设置为
    multipart/form-data
  2. 将 json 值作为表单的键值对发送
curl -s POST localhost:3000/uploads \
-H "Content-Type: multipart/form-data" \
-H "Accept: application/json" \
-F "avatar=@/home/abhinasregmi/Pictures/me/pooja_time.jpg" \
-F "name=Abhinas Regmi" \
-F "age=23" \
-F "[email protected]"

我在本地机器上进行了测试。文件验证有效,端点能够正确地将键值解析为 json。

© www.soinside.com 2019 - 2024. All rights reserved.