使用cURL发送请求,并将POST数据从文件中获取。

392

我需要通过命令行使用cURL进行POST请求。该请求的数据位于一个文件中。我知道通过--upload-file选项可以使用PUT方法完成这个操作。

curl host:port/post-file -H "Content-Type: text/xml" --data "contents_of_file"

请检查我的答案,https://dev59.com/4W025IYBdhLWcg3wHR4Y#6213693 - Muhammad Zeeshan
1
抱歉,也许我错误地描述了我的问题,我需要通过Linux操作系统的命令行使用curl命令发送请求,而不是通过php-curl。 - user253202
6个回答

552
你正在寻找--data-binary参数。
curl -i -X POST host:port/post-file \
  -H "Content-Type: text/xml" \
  --data-binary "@path/to/file"

在上面的示例中,-i 打印出所有的头部信息,以便您可以看到发生了什么,-X POST 明确指出这是一个 POST 请求。这两个选项可以安全地省略,而不会改变网络传输的行为。文件的路径需要在前面加上一个 @ 符号,这样 curl 就知道要从文件中读取。

86
@ 部分非常重要! - Ron Klein
13
实际上,您只需使用“-d”标志即可。 - Anatoly Yakimchuk
31
-d 选项将导致 curl 删除换行符,但 --data-binary 不会。 - Asclepius
5
对于那些无法使其正常工作的人,请确保在您的标头中指定内容类型! - Susanne Peng
2
如果你正在与数据文件处于相同路径下执行curl命令,那么它只需是--data-binary "@file" - Cale Sweeney
显示剩余4条评论

119

我需要通过命令行使用Curl发出POST请求。该请求的数据位于文件中...

您只需要确保--data参数以@符号开头:

curl -H "Content-Type: text/xml" --data "@path_of_file" host:port/post-file-path
例如,如果您的数据存储在名为stuff.xml的文件中,则可以执行以下操作:
curl -H "Content-Type: text/xml" --data "@stuff.xml" host:port/post-file-path

stuff.xml文件名可以被相对路径或完整路径替换: @../xml/stuff.xml, @/var/tmp/stuff.xml, ...


5
如果你需要发送一个指定名称的字段,你也可以使用 --data "name@stuff" - Hermann
非常流畅的解决方案!100% - Leon Africa

26
如果您要使用表单数据上传文件,必须指定一个参数名称,您可以使用以下命令:

curl -X POST -i -F "parametername=@filename" -F "additional_parm=param2" host:port/xxx


8
大多数答案都很完美,但当我为我的特定问题着手时,我需要使用POST方法上传二进制文件(XLSX电子表格),我发现有一件遗漏的事情,即通常不仅是你加载的文件,你可能还有更多的表单数据元素例如文件的注释或标签等,就像我的情况一样。因此,我想在这里添加它作为我的用例,以帮助其他人。
curl -POST -F comment=mycomment -F file_type=XLSX -F file_data=@/your/path/to/file.XLSX http://yourhost.example.com/api/example_url

5

我在传递文件参数时遇到了类似的问题。使用-F选项可以将文件作为表单数据进行传递,但文件的内容类型为application/octet-stream。我的端点预期的是text/csv类型。

你可以使用以下语法设置文件的MIME类型:

-F 'file=@path/to/file;type=<MIME_TYPE>

因此,对于CSV文件,完整的cURL命令如下:

curl -X POST -F 'file=@path/to/file.csv;type=text/csv' https://test.com

这里有很好的文档介绍关于这个和其他选项:https://catonmat.net/cookbooks/curl/make-post-request#post-form-data


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接