2015-12-08 75 views
0

此問題來自我的previous question關於同一主題。簡單的文件上傳是,簡單Dropbox v2 API - 大文件上傳

$headers = array("Authorization: Bearer dropbox_token", 
        'Content-Type: application/octet-stream', 
       'Dropbox-API-Arg: {"path":"/path/file.ext", 
       "mode":"add"}'); 

$data = "I love Stackoverflow"; 
$ch = curl_init('https://content.dropboxapi.com/2/files/upload/'); 
curl_setopt($ch,CURLOPT_HTTPHEADER,$headers); 

curl_setopt($ch,CURLOPT_POST,true); 
curl_setopt($ch,CURLOPT_POSTFIELDS,$data); 
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true); 
$response = curl_exec($ch); 
curl_close($ch); 
echo $response; 

但是,當要保存的文件數據運行到10兆字節時,這不是一個可行的選項。我以爲我會簡單地使用新的(ish)PHP curl_file_create

$headers = array("Authorization: Bearer Dropbox token", 
       'Content-Type: application/octet-stream', 
       'Dropbox-API-Arg: {"path":"/path/bigfile.txt", 
           "mode":"add"}'); 

$ch = curl_init('https://content.dropboxapi.com/2/files/upload/'); 
curl_setopt($ch,CURLOPT_HTTPHEADER,$headers); 
$args['file'] = curl_file_create('/path/to/bigfile.txt'); 

curl_setopt($ch,CURLOPT_POST,true); 
curl_setopt($ch,CURLOPT_POSTFIELDS,$args); 
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true); 
$response = curl_exec($ch); 
curl_close($ch); 
echo $response; 

但是,這是行不通的。 Dropbox API返回消息

調用API函數「files/upload」時出錯:錯誤的HTTP「Content-Type」頭:「application/octet-stream; boundary = --...期待「application/octet-stream」,「text/plain;字符集=的Dropbox-CORS-破解

我將不勝感激的人誰可以告訴我,我可能是錯在這裏去。

+0

@arkascha - 一個毫無意義對目前的討論 – DroidOS

回答

2

它看起來像curl_file_create將文件編碼爲多部分表單上傳,這不是您在與Dropbox API交談時想要的內容。

如果我理解正確,您嘗試解決的問題是您不想將整個文件內容加載到內存中。是對的嗎?

如果是這樣,請進行以下嘗試。 (道歉,我沒有測試它在所有的,所以它可能有錯誤。)

$headers = array('Authorization: Bearer Dropbox token', 
       'Content-Type: application/octet-stream', 
       'Dropbox-API-Arg: {"path":"/path/bigfile.txt", 
            "mode":"add"}'); 

$ch = curl_init('https://content.dropboxapi.com/2/files/upload'); 
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
curl_setopt($ch, CURLOPT_POST, true); 

$path = '/path/to/bigfile.txt'; 
$fp = fopen($path, 'rb'); 
curl_setopt($ch, CURLOPT_INFILE, $fp); 
curl_setopt($ch, CURLOPT_INFILESIZE, filesize($path)); 

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
$response = curl_exec($ch); 

curl_close($ch); 
fclose($fp); 

echo $response; 

注意,你可能還需要考慮/files/upload_session_start, etc.如果您要上傳大文件。這可以讓你上傳塊,它支持大於150MB的文件(其中/files/upload不支持)。

+0

沒有任何價值的評論非常感謝。你的代碼可以做到這一點。我編輯了一下,修復了一些小錯誤。 – DroidOS

+0

@DroidOS感謝您修復它! – smarx

+0

非常感謝! $ fp = fopen($ path,'rb'),爲我做了 – idragosalex

1

如果任何人有興趣在其CURLOPT_INFILE不工作的Dropbox API V2速戰速決,去這個鏈接Dropbox PHP v2 upload issue

格雷格解釋,並建議使用該代碼的curl_setopt($ch, CURLOPT_POSTFIELDS, fread($fp, $filesize))代替curl_setopt($ch, CURLOPT_INFILE, $fp);

+0

沒關係,我在這裏發佈了更好的答案:https://stackoverflow.com/questions/34200164/dropbox-php-v2-upload-issue/34213000#34213000 – Greg