Этот вопрос следует из моего предыдущего вопроса по тому же вопросу. Простые загрузки файлов, ну, просто .
$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-хак
Я был бы очень благодарен всем, кто мог бы рассказать мне, где я могу ошибиться.
Похоже, 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);