PHP Curl File Upload发送Empty Upload

时间:2012-06-19 04:22:50

标签: php curl upload

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

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

1 个答案:

答案 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传递任何内容都会将请求方法隐式设置为POSTContent-Typeapplication/x-www-form-urlencoded。传递数组时,值可能以@开头,表示文件上传(这样做也应隐式将Content-Type更改为multipart/form-data)。

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

  1. 使用--data-binary指定包含原始二进制数据的文件
  2. 使用--data--data-ascii指定包含网址编码数据的文件
  3. 使用--F--form
  4. 后者的行为与将数组传递给CURLOPT_POSTFIELDS并使用@前缀相同。其他两个与传递字符串的行为相同。