Я пытаюсь загрузить файл на Google Drive с помощью PHP. Я использую многоэтапный тип загрузки, поскольку это большой файл (резервная копия базы данных MySQL). Это должно быть запущено из сценария оболочки для целей резервного копирования.
Всякий раз, когда вы публикуете небольшой файл, мой код работает отлично, и файл загружается на Google Drive. Однако всякий раз, когда я пытаюсь загрузить файл большего размера, я получаю сообщение об ошибке
HTTP/1.1 400 Bad Request
Content-Length: 39
Date: Mon, 06 Oct 2014 12:41:30 GMT
Server: UploadServer ("Built on Sep 24 2014 16:50:43 (1411602643)")
Content-Type: text/html; charset=UTF-8
Alternate-Protocol: 443:quic,p=0.01
Missing end boundary in multipart body
Сжатый вывод того, что я публикую
--54328df935387
Content-Type: application/json; charset=UTF-8
{"title":"MySQL backup","description":"Backup taken of MySQL database"}
--54328df935387
Content-Type: text/plain
-- MySQL dump 10.13 Distrib 5.5.38, for debian-linux-gnu (x86_64)
**ACTUAL DATA OMITTED**
-- Dump completed on 2014-10-06 23:41:29--54328df935387--
Соответствующий код PHP
$post = $client->createRequest('POST','https://www.googleapis.com/upload/drive/v2/files?uploadType=multipart',['expect'=>false,'body'=>$string]);
$post->setHeader('Authorization','Bearer '.$access_token);
$post->setHeader('Content-Type','multipart/related; boundary="'.$boundary.'"');
$length = strlen(json_encode($metadata))+filesize('mysql_backup.sql');
$post->setHeader('Content-Length',$length);
try {
$response = $client->send($post);
echo $response->getBody();
} catch (\GuzzleHttp\Exception\ClientException $e){
echo $e->getResponse();
}
Я могу воспроизвести эту ошибку только при публикации файлов размером более 1 МБ.
Я использую Guzzle, чтобы сделать запрос POST. Граница генерируется uniqid()
,
Задача ещё не решена.
Других решений пока нет …