首页 > 解决方案 > 谷歌云存储桶,无法上传重音文件名

问题描述

我创建了一个备份工具,使用该代码将我的所有服务器文件上传到谷歌云存储桶:

$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函数使用文件名(即使我发送文件处理程序)并且我没有任何方法可以使其工作。

标签: phputf-8google-cloud-storage

解决方案


正如文档中提到的 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);

让我知道这些信息是否对您有帮助!


推荐阅读