我正在尝试转换以下CURL:
curl -X POST \
-H "Content-Type: image/jpeg" \
--data-binary '@myPicture.jpg' \
https://api.parse.com/1/files/pic.jpg
到PHP:
$ch = curl_init();
$data = array('myPicture.jpg' => "@myPicture.jpg");
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt ($ch, CURLOPT_POSTFIELDS, $data);
$headers = array();
$headers[] = "Content-Type: image/jpeg";
curl_setopt ($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt ($ch, CURLOPT_URL, 'https://api.parse.com/1/files/myPicture.jpg');
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt ($ch, CURLOPT_VERBOSE, true);
$response = curl_exec($ch);
curl_close($ch);
但我的回答是false
。这是我从print_r(curl_getinfo($ch), true)
得到的:
Array
(
[url] => https://api.parse.com/1/files/myPicture.jpg
[content_type] =>
[http_code] => 0
[header_size] => 0
[request_size] => 0
[filetime] => -1
[ssl_verify_result] => 20
[redirect_count] => 0
[total_time] => 0.28
[namelookup_time] => 0.187
[connect_time] => 0.218
[pretransfer_time] => 0.28
[size_upload] => 0
[size_download] => 0
[speed_download] => 0
[speed_upload] => 0
[download_content_length] => -1
[upload_content_length] => -1
[starttransfer_time] => 0
[redirect_time] => 0
)
关于为什么这不起作用的任何想法?谢谢!
答案 0 :(得分:10)
ssl_verify_result
的值为20
,这意味着,根据文档:
无法获得本地颁发者证书
无法找到本地查找证书的颁发者证书。这通常意味着可信证书列表不完整。
您可以在不先验证对等方的情况下尝试:
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
如果可行,则必须指定最近CA捆绑包的路径。另见:http://curl.haxx.se/docs/sslcerts.html
您还应该检查您尝试上传的文件是否在预期的文件夹中。如果您指定CURLOPT_VERBOSE = 1
,它也应该警告您。
<强>更新强>
检查API文档后,该服务不期望定期上传文件(即"multipart/form-data"
);相反,需要原始上传。
这可以通过以下方式实现:
curl_setopt($ch, CURLOPT_POSTFIELDS, file_get_contents('myPicture.jpg'));
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: image/jpeg"));
更新2
使用CURLOPT_POSTFIELDS
传递任何内容都会将请求方法隐式设置为POST
和Content-Type
至application/x-www-form-urlencoded
。传递数组时,值可能以@
开头,表示文件上传(这样做也应隐式将Content-Type
更改为multipart/form-data
)。
命令行curl
允许@
在几个地方:
--data-binary
指定包含原始二进制数据的文件--data
或--data-ascii
指定包含网址编码数据的文件--F
或--form
后者的行为与将数组传递给CURLOPT_POSTFIELDS
并使用@
前缀相同。其他两个与传递字符串的行为相同。