Member 13777812 Ответов: 1

Я хочу загрузить больший файл в dropbox с помощью PHP curl в apiv2.


Привет,
Я хочу загрузить больший файл в Dropbox с помощью PHP curl в APIv2. Я написал код, но получаю ошибку status_code = 413(объект запроса слишком велик).
Я отправляю свой код. Ваша помощь была бы для меня большим одолжением.
https://content.dropboxapi.com/2/files/upload_session/start';
Чтобы выше мой код был:

$headers = array('Authorization: Bearer' . $token,
'Content-Type: application/octet-stream',
'Dropbox-API-Arg: '.
json_encode(
массив(

"закрыть"=>false,
)
),


'Content-Type: application/octet-stream'
);


$ч = curl_init($api_url);

curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POST, true);

$path = $destPath . $to_zip_folder;
//echo $path;die;
$fp = fopen($path, 'rb');
$filesize = размер файла($path);

curl_setopt($ch, CURLOPT_POSTFIELDS, ");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_VERBOSE, 1); // debug

$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);

curl_close($CH с);


ответ === {"session_id": "Aaaaaaaafxd8sqjqyoldq"}
http_code === 200
$api1_url = 'https://content.dropboxapi.com/2/files/upload_session/append_v2';
Для приведенного выше API мой код таков:

$headers1 = array('Authorization: Bearer' . $token,
'Content-Type: application/octet-stream',
'Dropbox-API-Arg: '.
json_encode(
массив(

"курсор"=>$w,

"закрыть" => false,
)
),

'Content-Type: application/octet-stream'
);
//print_r($headers1);die;



$ч = curl_init($api1_url);

curl_setopt($ch, CURLOPT_HTTPHEADER, $headers1);
curl_setopt($ch, CURLOPT_POST, true);

$path = $destPath . $to_zip_folder;
//echo $path;die;
$fp = fopen($path, 'rb');
$filesize = размер файла($path);

curl_setopt($ch, CURLOPT_POSTFIELDS, ");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_VERBOSE, 1); // debug

$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);

curl_close($CH с);
ответ === null
http_code === 200


$api2_url = 'https://content.dropboxapi.com/2/files/upload_session/finish';
Для приведенного выше API мой код таков:

$headers2 = array('Authorization: Bearer' . $token,
'Content-Type: application/octet-stream',
'Dropbox-API-Arg:' .
json_encode(
массив(

"курсор"=>$w1,
"commit"=>$q,

)
),
'Content-Type: application/octet-stream'
);
// print_r($headers2);die;
$ч = curl_init($api2_url);

curl_setopt($ch, CURLOPT_HTTPHEADER, $headers2);
curl_setopt($ch, CURLOPT_POST, true);

$path = $destPath . $to_zip_folder;
//echo $path;die;
$fp = fopen($path, 'rb');
$filesize = размер файла($path);

curl_setopt($ч, CURLOPT_POSTFIELDS, fread операционной($ФП$размер));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_VERBOSE, 1); // debug

$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);

curl_close($CH с);


http_code === 413
если я использую

curl_setopt($ч, CURLOPT_POSTFIELDS, fread операционной($ФП$размер));
тогда status_code = 413.



если я использую

curl_setopt($ch, CURLOPT_POSTFIELDS, ");
затем он сохранит 0-байтовый файл.



пожалуйста, предложите, каким должен быть curl для этих трех API?
Заранее спасибо.

Что я уже пробовал:

Я пробовал PHP Curl. Я не понимаю, в чем проблема?

1 Ответов

Рейтинг:
0

Jochen Arndt

Вы должны разделить данные на куски (< 150 МБ) и отправить их с помощью нескольких запросов.

То есть вы должны передать данные нескольких fread() вызовы с использованием размера блока до тех пор, пока все данные не будут отправлены (оставшийся размер с последним блоком).

Псевдокод:

$fp = fopen($path, 'rb');
$tosend = filesize($path);
$first = $tosend > $chunk_size ? $chunk_size : $tosend;
$data = read($fp, $first);
$tosend -= $first;
// Send data with start request here ($first bytes)
while ($tosend > $chunk_size)
{
    $data = read($fp, $chunk_size);
    $tosend -= $chunk_size;
    // Send data with append_v2 request here ($tosend bytes)
}
$data = read($fp, $tosend);
fclose($fp);
// Send remaining data with finish request here ($tosend bytes)


Member 13777812

Привет,
Спасибо за ваш ответ.
Каково значение $chunk_size в приведенном выше псевдокоде?
Я загрузил свой код выше. пожалуйста, предложите, как объединить это с псевдокодом, потому что я все еще получаю ошибку.

Ваша помощь будет очень кстати.
Заранее спасибо.

Jochen Arndt

Вы можете выбрать любое значение для $chunk_size при условии, что оно ниже максимального значения. значение 150 МБ упомянуто в документации DropBox API, потому что большее значение приведет к отправке больших блоков, которые будут отклонены с ошибкой 413.

Просто замените его
// Отправить комментарии к данным
с вашим существующим кодом для трех запросов Dropbox API (при условии, что он не содержит других ошибок).

Вы также можете взглянуть на некоторые PHP-проекты, использующие API DropBox. Некоторые из них есть на GitHub.

Member 13777812

Не могли бы вы предоставить ссылку, какие PHP-проекты используют API DropBox с помощью curl?
Благодарность

Jochen Arndt

Просто google для чего-то вроде "php dropbox api".