如何在带有多参数的 bash curl 命令中使用 --data-binary


<?php
$post_data = array(
'filename'=>new CurlFile($uploadPath),
'jsondata'=> json_encode($params,JSON_UNESCAPED_UNICODE)
$toPdfApi='https://example.com/convert2PDF'
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL,$toPdfApi);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl,CURLOPT_BINARYTRANSFER,true);
curl_setopt($curl, CURLOPT_HTTPHEADER, array(
'multipart/form-data',
'application/x-www-form-urlencoded'));
curl_setopt($curl, CURLOPT_POSTFIELDS,$post_data);
$result = curl_exec($curl);

然后我将其转换为 bash shell 命令

curl -i -X POST -H "Content-Type: multipart/form-data" -H "Content-Type: application/x-www-form-urlencoded" --data-binary  'filename=@/root/test.txt' --data-binary   'jsondata={"fileName":"test","id":"xxx","backlink":"https://example.com/hello"}' https://example.com/convert2PDF

但回应结果还是不对

HTTP/1.1 200 OK
Date: Fri, 01 Jun 2018 14:41:37 GMT
Content-Type: application/x-www-form-urlencoded
Transfer-Encoding: chunked
Server: Jetty(9.4.5.v20170502)
error

有人可以帮忙吗? 是我的隐蔽炮弹吧?

如果我使用以下命令[将-data-binary替换为-F],我得到了正确的状态,但是从php代码中我知道我应该在bash curl中添加CURLOPT_BINARYTRANSFER,否则 https://example.com/convert2PDF 无法获得正确的帖子数据。

curl -i -X POST -H "Content-Type: multipart/form-data" -H "Content-Type: application/x-www-form-urlencoded" -F  'filename=@/root/test.txt' -F   'jsondata={"fileName":"test","id":"xxx","backlink":"https://example.com/hello"}' https://example.com/convert2PDF
HTTP/1.1 100 Continue
HTTP/1.1 200 OK
Date: Fri, 01 Jun 2018 16:29:35 GMT
Content-Type: application/x-www-form-urlencoded
Transfer-Encoding: chunked
Server: Jetty(9.4.5.v20170502)
success

我想得到响应的状态是200,结果在--data-bin模式下成功,我该怎么做才能udpup我的bash命令?

--data-binary

的全部意义在于它是一个大字节块。您只能发送一个,因为每个 HTTP 请求只有一个正文,并且只能有一个顶级内容类型。

您似乎正在尝试构造一个多部分请求正文,该正文包含两部分,一部分包含文件数据,另一部分包含键/值对。

要通过命令行发送包含某些元数据的文件,您可以执行以下操作:

curl -F'id=xxx' -F 'name=foo' -F'file=@test.txt;type=text/plain' http://example.com

这将发送一个多部分请求,PHP后端可以访问$_POST的元数据和$_FILES的文件数据。

所需的确切方法将取决于后端期望接收的内容,但您尚未发布。

例如,以下内容适用于 --data-binary(根据您的问题(,但参数和文件数据都将在后端以不同的方式访问。

curl --data-binary '@test.txt' 'http://example.com?id=xxx&name=foo'

最新更新