如何使用cURL将文件内容发送作为主体实体

322

我正在使用cURL命令行工具向Web服务发送HTTP POST请求。我想将文件内容作为POST的主体实体包含在内。我尝试使用-d </path/to/filename>以及其他包含类型信息的变量,例如--data </path/to/filename> --data-urlencode </path/to/filename>等等,但文件总是被附加在外面。我需要它作为主体实体。

4个回答

536
我相信你正在寻找@filename语法,例如:

strip new lines

curl --data "@/path/to/filename" http://...

保留换行符

curl --data-binary "@/path/to/filename" http://...

curl将从文件中删除所有换行符。如果您想带有换行符发送文件,请使用--data-binary代替--data。


29
如果你想要更加高级一些,可以这样做:cat file.txt | curl --data "@-" \(< url.txt )`。其中的@-告诉curl从标准输入读取数据。你也可以直接使用重定向符号(< x.txt )`来替代。如果你在使用bash。 - Breedly
72
使用curl命令时,如果你想保留文件中的换行符,请使用--data-binary选项代替--data选项。因为--data选项会将文件中所有的换行符都去掉。请注意,翻译过程中不得改变原文意思。 - Chris
现在怎么添加登录凭据来授权这个请求? - fIwJlxSzApHEZIl
@anon58192932 - 这取决于服务器的安全协议。如果您正在使用name:value对,例如用户名和密码,则需要添加与服务期望的匹配的必要标头:--header:"<header_name>:<header_value>"作为一个字符串。 - Roy Hinkley

34

我知道这个问题已经得到了解答,但在我的情况下,我尝试将文本文件的内容发送到Slack Webhook API, 但由于某种原因,上面的答案并没有起作用。最终以下方法帮助了我:

curl -X POST -H --silent --data-urlencode "payload={\"text\": \"$(cat file.txt | sed "s/\"/'/g")\"}" https://hooks.slack.com/services/XXX

这个程序不会将点转换为下划线(. -> _),并保留换行符。谢谢! - Ramon Fincken
1
很酷,但它并没有回答问题,因为文件在命令行上被分解而不是为curl指定。我还想知道是否需要转义所有shell的特殊字符--但我对此不太了解 ;) - Gerard ONeill
4
对于一个非常大的内容文件,上述curl命令将无法工作。在这种情况下,接受的答案是救命稻草:curl --data "@/path/to/filename" http://..." - Another coder

18

在我的情况下,@ 导致了某种编码问题,我仍然更喜欢我的旧方法:


curl -d "$(cat /path/to/file)" https://example.com

12
对于大文件,这将导致“参数列表太长”的错误。 - Sigmatics

-6

curl https://upload.box.com/api/2.0/files/3300/content -H "Authorization: Bearer $access_token" -F file=@"C:\Crystal Reports\Crystal Reports\mysales.pdf"

使用curl命令上传文件到Box的API 2.0。需要提供访问令牌(access_token)作为请求标头中的身份验证信息,并且需要指定待上传文件的路径及名称。


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