2017-02-01 59 views
0

我有一個PHP文件上傳到Dropbox的文件。當我作爲一個獨立的腳本從命令行運行它時,它完美地工作。但是,當我將我的代碼合併到較大的項目中時,文件無法上傳,cURL返回「errno」0(意思是,沒有cURL錯誤),並且Dropbox的API沒有輸出。Dropbox - 從url上傳文件並不一致地工作

這裏是工作的代碼:

$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); 


} 

回答

0

我爆發API調用本身,就像這樣:

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

這給我看了API的實際錯誤:

錯誤調用API函數「文件/上傳」:HTTP標頭「Dropbox的-API精氨酸」:無法解碼輸入作爲JSON

對於不同類型的錯誤,該API將返回平原文字或JSON,迴應Content-Type標題告訴你哪個。在你的代碼中,你只能處理JSON,而當它沒有提供有效的JSON時,json_decode顯然會默默失敗。

無論如何,該錯誤表明爲上傳參數提供的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}'));