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 » ; кодировок = раздаточная-CORS-хак

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

Related of "Dropbox v2 API – большие загрузки файлов"

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

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

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