【问题标题】:How Can I Post Files and JSON Data Together With Curl?如何使用 Curl 发布文件和 JSON 数据?
【发布时间】:2014-03-23 18:47:27
【问题描述】:

我一直在用这个 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 请求中?

【问题讨论】:

  • 听起来 curl 已经告诉了你答案......你的 HTTP 请求的内容类型是 json,而不是 multipart/form-data——它不能包含文件 AFAIK。如果您要发送有关文件的元数据,则可能应作为 HTTP 请求标头发送。
  • 愿意接受这个作为答案,但你不能在 cmets 上这样做。

标签: json post file-upload curl curl-commandline


【解决方案1】:

@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/

commentcurrent 可以组合成 "metadata"request.headersflask web 服务器上的处理部分。

【讨论】:

    【解决方案2】:

    这对我有用:

    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 数据。

    【讨论】:

      【解决方案3】:

      我已经成功开发了类似的端点,这些端点接受多个文件及其 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\":\"john.smith@gmail.com\"};type=application/json" http://localhost:8080/api/v1/user/
      

      请注意在元数据请求部分的末尾添加了;type=application/json。上传多个不同类型的文件时,可以在-F值末尾定义mime类型。

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

      【讨论】:

      • 谢谢 - 添加;type=application/json 对我有用。知道如何通过 PHP cURL 完成吗? :)
      【解决方案4】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2015-05-05
        • 2012-06-20
        相关资源
        最近更新 更多