Я создал инструмент резервного копирования, который загружает все файлы моего сервера в облачное хранилище Google с этим кодом:
$sha256 = hash_file("sha256", $filepath);
$bucket->upload(fopen($filepath, 'r'), [
'name' => utf8_encode($filepath),
'metadata' =>
[
'metadata' =>
[
'sha256' => $sha256,
]
]
]
);
Он работает для большинства файлов, но когда в имени файла появляется акцент следующая ошибка:
Fatal error: Uncaught Google\Cloud\Core\Exception\BadRequestException: Malformed multipart body. in /var/www/vendor/google/cloud-core/src/RequestWrapper.php on line 362
( ! ) Google\Cloud\Core\Exception\BadRequestException: Malformed multipart body. in /var/www/vendor/google/cloud-core/src/RequestWrapper.php on line 362
Call Stack
# Time Memory Function Location
4 12.1068 2043584 Google\Cloud\Storage\Bucket->upload( ) .../backupall.php:190
5 12.1111 2060368 Google\Cloud\Core\Upload\MultipartUploader->upload( ) .../Bucket.php:293
6 12.1145 2074984 Google\Cloud\Core\RequestWrapper->send( ) .../MultipartUploader.php:68
Если я удаляю utf8_encode, я получаю еще одну ошибку:
Fatal error: Uncaught InvalidArgumentException: json_encode error: Malformed UTF-8 characters, possibly incorrectly encoded in /var/www/vendor/google/cloud-core/src/JsonTrait.php on line 61
( ! ) InvalidArgumentException: json_encode error: Malformed UTF-8 characters, possibly incorrectly encoded in /var/www/vendor/google/cloud-core/src/JsonTrait.php on line 61
Call Stack
# Time Memory Function Location
4 12.1204 2043576 Google\Cloud\Storage\Bucket->upload( ) .../backupall.php:190
5 12.1247 2060360 Google\Cloud\Core\Upload\MultipartUploader->upload( ) .../Bucket.php:293
6 12.1250 2063728 Google\Cloud\Core\Upload\MultipartUploader::jsonEncode( ) .../MultipartUploader.php:42
РЕДАКТИРОВАТЬ: после следующих тестов я думаю, что это ошибка библиотеки, даже с использованием имя без акцента У меня та же ошибка, и если я сохраняю имя, но меняю файл на другой, он работает:
//this one doesn't work
$bucket->upload(fopen($filepath, 'r'), [
'name' => "testname",
'metadata' =>
[
'metadata' =>
[
'sha256' => $sha256,
]
]
]
);
//this one works
$bucket->upload(fopen("testfile", 'r'), [
'name' => utf8_encode($filepath),
'metadata' =>
[
'metadata' =>
[
'sha256' => $sha256,
]
]
]
);
Это означает, что проблема в том, что функция upload
использует имя файла (даже если я отправлю обработчик файла) и что у меня не будет способа заставить его работать.