php - 谷歌云存储桶,无法上传重音文件名
问题描述
我创建了一个备份工具,使用该代码将我的所有服务器文件上传到谷歌云存储桶:
$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
函数使用文件名(即使我发送文件处理程序)并且我没有任何方法可以使其工作。
解决方案
正如文档中提到的 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);
让我知道这些信息是否对您有帮助!
推荐阅读
- apache-spark - Databrick连接在Linux的VsCode中引发错误?
- c# - 使用 .net 核心在集成测试中模拟类型化 HttpClient
- keycloak - 如何在 keycloak 中重新导入领域。如果已经存在
- spring - JWT 令牌给出 SignatureException 异常
- visual-studio-code - 在 VS 代码中,每次都需要使用实时服务器打开才能在 Web 浏览器上查看代码中所做的更改
- r - R - 将所有 4 位字符更改为前面有一个 0,但保持所有 5 位值相同
- node.js - 你如何在 React.js 中使用 Sendgrid?
- javascript - 如何在我的 React 网站中为登录页面设置自定义声明
- android - 如何在 Xamarin Forms 中的数据绑定指定的位置放置文本
- python - Python、matplotlib、ValueError:一个序列的真值是模棱两可的。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()