通过Curl发送文件中指定的数据的POST请求


241

我需要从命令行通过Curl发出POST请求。该请求的数据位于文件中。我知道通过PUT可以使用该--upload-file选项来完成。

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

检查我的答案,stackoverflow.com
questions/6213509/send

1
抱歉,我可能错误地描述了我的问题,我不需要通过php-curl而是仅通过linux操作系统的命令行中的curl命令发送请求。
2011年

Answers:


362

您正在寻找--data-binary参数:

curl -i -X POST host:port/post-file \
  -H "Content-Type: text/xml" \
  --data-binary "@path/to/file"

在上面的示例中,-i打印出所有标题,以便您可以查看正在发生的情况,并-X POST明确指出这是帖子。可以安全地忽略这两个选项,而无需更改导线的行为。文件的路径前面必须有一个@符号,因此curl知道要从文件中读取。


@ɢʜʘʂʈʀɛɔʘɴ在这种情况下将是.xml
dennismonsewicz 2014年

53
@部分非常重要!
罗恩·克莱因

因此,我们使用--data-binary参数,但是实际的文件内容可以是文本吗?由于XML通常不是二进制的。
戴维(David)

8
实际上,您可以仅使用-d标志
Anatoly Yakimchuk '16

16
@ Tol182 -d将导致curl删除换行符,但--data-binary不会。
Acumenus

44

我需要从命令行通过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,...


2
如果您需要发送命名字段,也可以使用--data "name@stuff"
赫尔曼

15

如果使用表单数据上载文件(必须指定参数名称),则可以使用:

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


谢谢!1.解决方案对我不起作用。parametername=真的帮了我大忙:)
半机械人2015年

3

大多数答案在这里都是完美的,但是当我针对特定问题登陆此处时,我必须使用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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.