это правильный способ сделать это, если вы используете Linux или MacOS * или * BSD и не заботитесь о совместимости с Windows, но все же я хочу воспользоваться вашим кодом:
Если вы когда-нибудь напишите какой-либо код, который может работать в Windows, установите привычку использовать режим fopen rb
вместо r
, потому что режим fopen r
в окнах может повредить двоичные данные (и это происходит из-за вашего * 1006). * header, это двоичные данные) и linux / macos / * BSD обрабатывают режимы r
и rb
одинаково, поэтому сделайте его
$fp = fopen($localFile, 'rb');
и эта строка
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
"authorization: Bearer MY-TOKEN",
"content-type: application/octet-stream",
"dropbox-api-arg: {\"path\": \"/tmp/a.txt\",\"mode\": \"add\",\"autorename\": true,\"mute\": false,\"strict_conflict\": false}"
));
должен на самом деле читать
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
"authorization: Bearer MY-TOKEN",
"content-type: application/octet-stream",
"dropbox-api-arg: " . json_encode(array(
'path' => '/tmp/a.txt',
'mode' => 'add',
'autorename' => true,
'mute' => false,
'strict_conflict' => false,
))
));
он просто более читабелен, более удобен в обслуживании и его легче модифицировать. хотя я должен сказать, что размещение этих данных в качестве заголовка HTTP было плохим дизайнерским решением со стороны Dropbox, есть символы, которые являются недопустимыми в заголовках HTTP, которые являются совершенно допустимыми в именах файлов по большинству стандартов файловой системы, то есть я подозреваю, что возможно создать правильный json, содержащий допустимое имя файла, которое не может быть закодировано в http-заголовке ... они должны были использовать вместо этого multipart / form-data и просто поместить файл и json как две отдельные переменные формы, imo.