PHP Curl File Upload发送Empty Upload

Gar*_*ett 4 php upload curl

我正在尝试转换以下CURL:

curl -X POST \
  -H "Content-Type: image/jpeg" \
  --data-binary '@myPicture.jpg' \
  https://api.parse.com/1/files/pic.jpg
Run Code Online (Sandbox Code Playgroud)

到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);
Run Code Online (Sandbox Code Playgroud)

但我的回答是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
)
Run Code Online (Sandbox Code Playgroud)

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

Ja͢*_*͢ck 10

的ssl_verify_result具有值20,这意味着,根据本文档:

无法获得本地发行人证书

无法找到本地查找证书的颁发者证书.这通常意味着可信证书列表不完整.

您可以先尝试不先验证对等方:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
Run Code Online (Sandbox Code Playgroud)

如果可行,则必须指定最近的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"));
Run Code Online (Sandbox Code Playgroud)

更新2 使用递东西CURLOPT_POSTFIELDS将隐式请求方法设置为POST与Content-Type对application/x-www-form-urlencoded.传递数组时,值可能从@指示文件上载开始(这样做也应隐式更改Content-Type为multipart/form-data).

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

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

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