Dropbox - 从网址上传文件并不一致

时间:2017-02-01 13:59:30

标签: php curl dropbox-api dropbox-php

我有一个将脚本上传到Dropbox的PHP脚本。当我从命令行运行它作为一个独立的脚本时,它运行得很好。

但是,当我将代码合并到较大的项目中时,文件无法上传,cURL返回" errno" 0(意思是没有cURL错误),并且Dropbox的API没有输出。

以下是有效的代码:

    $token = '<token>';
$url = "https://content.dropboxapi.com/2/files/upload";

    $post_body = file_get_contents("/other/server/url/test.txt");

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: Bearer ' . $token,
                                           'Content-Type: application/octet-stream', 
                                           'Dropbox-API-Arg: {"path": "/Dropbox/path/subfolder/test.txt","mode": "add", "autorename": true, "mute": false}'));
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_body); 


curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
$data = json_decode(curl_exec($ch), true);
curl_close($ch); 

print_r($data);

....这里是破碎的代码:

private function dropbox_uploadFile( $path, $file_source, $file_name = "test1.txt") {


    echo "<br /><br />PATH: ". $path . '/' . $file_name . "<br /><br />";
    echo "<br /><br />SOURCE: ". $file_source . "<br /><br />";


    $token = '<token>';
    $url = "https://content.dropboxapi.com/2/files/upload";

    $post_body = file_get_contents( $file_source );

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: Bearer ' . $token,
                                               'Content-Type: application/octet-stream', 
                                               'Dropbox-API-Arg: {"path": ' . $path.'/'.$file_name. '","mode": "add", "autorename": true, "mute": false}'));

    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post_body); 
    curl_setopt($ch,CURLOPT_SSL_VERIFYPEER, false);  // to prevent cURL error #60

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    $data = json_decode(curl_exec($ch), true);

    if( ! $data ) {
        echo "<pre>";
        print_r(curl_getinfo($ch));
        echo "</pre>";

        echo "ERROR: " . curl_errno( $ch ) . "<br /><br />";
    }

    curl_close($ch); 
    print_r($data);


}

1 个答案:

答案 0 :(得分:0)

我打破了API调用本身,如下所示:

$res = curl_exec($ch);
print_r($res);
$data = json_decode($res, true);

这向我展示了API的实际错误:

  

调用API函数“files / upload”时出错:HTTP标头“Dropbox-API-Arg”:无法将输入解码为JSON

对于不同类型的错误,API将返回纯文本或JSON,响应Content-Type标题会告诉您哪个。在您的代码中,您只处理JSON,json_decode显然在未提供有效JSON时无声地失败。

无论如何,该错误表明上传参数提供的JSON本身无效。问题似乎是在path值的开头缺少引号,修复此处:

curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: Bearer ' . $token,
                                           'Content-Type: application/octet-stream',
                                           'Dropbox-API-Arg: {"path": "' . $path.'/'.$file_name. '","mode": "add", "autorename": true, "mute": false}'));