Google cloud bucket, не могу загрузить акцентированное имя файла - PullRequest
0 голосов
/ 19 марта 2020

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

1 Ответ

0 голосов
/ 19 марта 2020

Как упомянуто в документации PHP utf8_encode () Функция:

Функция utf8_encode () кодирует строку ISO-8859-1 в UTF-8.

Это означает, что любой другой формат в ISO, которым является строка, не будет преобразован - что может быть в случае, если вы сталкиваетесь - вы можете более подробно изучить эту документацию. Проблемы кодирования имени файла и проблемы совместимости для ошибок, связанных с кодировкой имени файла .

Официальная документация от PHP - доступна здесь - указывает, что в случае, если ваша строка не в этом ISO, вы должны использовать метод iconv() для преобразования вашей строки - в любом случае, это может стоить того, так как эта работа аналогична utf8_encode().

, я бы порекомендовал вам попробовать, используя метод iconv(), чтобы убедиться, что он работает. Примеры, такие как приведенный ниже пример использования этого метода, можно найти в этом другом сообщении сообщества здесь.

$filepath = iconv("utf-8", "<code from the string>", $filename);

Дайте мне знать, помогла ли вам информация!

...