CLI CURL -> PHP CURL

3

我该如何将这个curl命令翻译成适用于PHP脚本的形式?

curl --request POST --data-binary '@import.xml' --header "Content-Type: application/atom+xml" --header "Content-Length: 378" "http://url.com"

这个不起作用:

$data = array('file'=>$filename);                    

    $headers = array(
        'Content-Type: application/atom+xml',
        'Content-Length: 378'
    );

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, 'httpL//url.com');
curl_setopt($ch, CURLOPT_BINARYTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);  
curl_exec($ch);

你找到答案了吗?我正在努力翻译类似的东西。 - TechFanDan
3个回答

4

试试这个:

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'Content-Type: application/atom+xml'
    ));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, 'http://siteurl.com');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, file_get_contents($filename));  
curl_exec($ch);

0
正确的做法是将文件读入字符串,然后将该字符串提供给CURLOPT_POSTFIELDS选项。libcurl不提供将文件读入字符串的功能,但命令行客户端可以实现这一点,我认为PHP/CURL绑定没有提供相应的功能。
命令行使用--data-binary对应于带有字符串的CURLOPT_POSTSFIELDS,而不是哈希数组,因为数组会将POST转换为多部分POST(命令行使用-F、--form)。此外,将自定义请求设置为POST完全是多余的。
通常情况下,使用“--libcurl test.c”运行命令行是使用C API编写C程序的第一草稿版本的好方法,但由于PHP API非常相似,因此在大多数情况下,这应该是一个不错的开始。
编辑:除非您非常了解自己在做什么,否则自定义更改/提供“Content-Length:”标头永远不是一个好主意。libcurl将始终提供基于传递给它的数据生成的标头。

-1
$data = array('file'=> '@' . $filename);                    

你需要在文件名前加上“@”符号,告诉CURL它实际上是一个文件名而不仅仅是一个字符串。头部信息也不是必需的,因为CURL会自动填充。


从手册中:「要发布文件,请在文件名前加上 @ 并使用完整路径。」不起作用... - Jocky
头文件不是必需的,因为CURL会自动填充它们。但在CLI CURL中,它们是必须的。 - Jocky
PHP CURL以成功结束,但结果不正确 - 在CLI CURL中是另一个。 - Jocky
$upload = file_get_contents($filename); ... curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); curl_setopt($ch, CURLOPT_POSTFIELDS, $upload); - Jocky
这个答案是错误的。命令行使用--data-binary,它对应于一个POSTSFIELDS,其中包含一个字符串,而不是哈希数组,因为数组会将POST转换为多部分。此外,设置为POST的自定义请求完全是多余的。 - Daniel Stenberg
显示剩余3条评论

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