2015-12-08 3 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; 

Однако это не работает. API Dropbox возвращает сообщение

Ошибка в вызове API-функции «файлы/выгрузка»: неверный HTTP-заголовок «Content-Type»: «application/octet-stream; border = --... Ожидание одного из «application/octet-stream», «text/plain; charset = dropbox-cors-hack

Я был бы очень признателен всем, кто мог бы рассказать мне, где я могу ошибаться.

+0

@arkascha - совершенно бессмысленно комментарий, который не добавляет никакой ценности в текущую дискуссию – DroidOS

ответ

2

Похоже, что curl_file_create кодирует файл как многостраничную загрузку формы, чего вы не хотите при разговоре с API Dropbox.

Если я правильно понимаю, проблема, которую вы пытаетесь решить, заключается в том, что вы не хотите загружать все содержимое файла в память. Это правильно?

Если да, просьба приложить следующие меры. (Извиняюсь, что я не проверял это на всех, поэтому она может содержать ошибки.)

$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., если вы загружаете файлы большого размера. Это позволяет загружать в куски и поддерживает файлы размером более 150 МБ (что не соответствует /files/upload).

+0

большое спасибо. Ваш код делает трюк. Я немного отредактировал его, чтобы исправить пару небольших ошибок. – DroidOS

+0

@DroidOS Спасибо за исправление! – smarx

+0

Большое спасибо! $ fp = fopen ($ path, 'rb'), сделал это для меня – idragosalex

1

Если кому интересно быстро исправить на Dropbox API v2, который CURLOPT_INFILE не работает, перейдите по этой ссылке Dropbox PHP v2 upload issue

Грег объяснить и предложил использовал этот код curl_setopt($ch, CURLOPT_POSTFIELDS, fread($fp, $filesize)) вместо curl_setopt($ch, CURLOPT_INFILE, $fp);

+0

Nevermind, я написал лучший ответ здесь: https://stackoverflow.com/questions/34200164/dropbox-php-v2-upload-issue/34213000#34213000 – Greg

Смежные вопросы