PHP Curl 文件上传发送空上传

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
)

有什么想法,为什么这不起作用?谢谢!

你有把图片放在与 PHP 文件相同的文件夹中吗?因为你指定了 @myPicture.jpg。另外,试试使用文件的绝对路径。 - Subir Kumar Sao
2
对于一个jpg的content-type,你应该实际上是这样写的,我个人认为,$data=file_get_contents("myPicture.jpg"); - UltraInstinct
太棒了,它起作用了!你想添加你的答案让我检查吗? - Garrett
1个回答

12

ssl_verify_result 的值为 20,根据文档的解释,意味着:

无法获取本地颁发者证书

本地查找证书的颁发者证书未能被找到。这通常意味着受信任证书列表不完整。

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

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
如果这样做可以有效,你将需要指定最新 CA bundle 的路径。详情请参见: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-Typemultipart/form-data)。

命令行工具curl在几个地方允许使用@

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

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


更新了那些选项,但仍然不起作用。@Thrustmaster的答案起作用了=S - Garrett
1
@Garrett 我明白了,响应似乎表明存在SSL问题;无论如何,在检查API文档后,我已经更新了我的答案。 - Ja͢ck
这个 cURL 中的 @ 是指原始数据吗?我猜我在试图理解命令行中 cURL 的解释方式。基于这个解决方案,我认为这意味着接收 URL 以某种方式只期望一个单一的参数...没有键名吗?似乎很奇怪。我遇到了和 Garrett 一样的问题,认为需要以相同 @ 的方式将参数配对成 k/v。 - dispake
遇到了类似的问题(ssl_verify_result = 20),可以通过使用“CURLOPT_SSL_VERIFYPEER”选项解决。谢谢! - Naderio

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