5

我正在尝试转换以下 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
)

关于为什么这不起作用的任何想法?谢谢!

4

1 回答 1

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-Typeapplication/x-www-form-urlencoded@Content-Typemultipart/form-data

命令行curl允许@在几个地方:

  1. 用于--data-binary指定包含原始二进制数据的文件
  2. 使用--data--data-ascii指定包含 url 编码数据的文件
  3. 使用--F--form

后者的行为与将数组传递给CURLOPT_POSTFIELDS并使用@前缀相同。其他两个的行为与传递字符串相同。

于 2012-06-19T04:31:47.660 回答