PHP卷曲文件上传发送空上传

PHP卷曲文件上传发送空上传

问题描述:

我尝试转换下面卷曲:PHP卷曲文件上传发送空上传

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

您是否在与php文件相同的文件夹中有图像?因为你指定@ myPicture.jpg。也请尝试使用文件的绝对路径。 –

+2

对于jpg的内容类型,实际上应该有:IMO,'$ data = file_get_contents(“myPicture.jpg”);' – SuperSaiyan

+0

WOOHOO THAT WORKED !!!想要添加您的答案,以便我可以检查它? – Garrett

ssl_verify_result20的值,这意味着,根据文档:

无法获取本地颁发者证书

的发行人证书本地抬头证书不能找到。这通常意味着可信证书列表不完整。

您可以尝试不先核实对方:

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指定使用--data--data-ascii指定包含网址编码数据
  2. 一个文件含有原始二进制数据
  3. 一个文件
  4. 使用--F--form

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

+0

更新了这些选项,但仍无法使用。 @ Thrustmaster的答案工作= S – Garrett

+1

@Garrett我看到了,回应似乎表明SSL问题;在任何情况下,我在检查API文档后更新了我的答案 –

+0

cURL中的@是什么意思?原始数据?我想我试图了解cmd线cURL是如何解释的。基于该解决方案,我假设这意味着接收URL有些如何只有一个参数..没有密钥名称?似乎很奇怪。我遇到了与Garrett相同的问题,并认为这些参数需要以与cmd线cURL相同的@方式与k/v配对。 – dispake