【发布时间】:2019-06-14 01:47:19
【问题描述】:
我正在尝试让用户从 AppEngine Flex (PHP 7.2) 上的应用直接上传到 Google Cloud Storage。该代码在本地工作(不使用 GCP 本地开发服务器),但是当我将代码上传到 AppEngine 并打开页面/视图时,我收到 500 错误。想知道是否有更多 GCP 和 GCS 经验的人可以指出我做错了什么?
我将调试语句(为简洁起见已删除)放入实时服务器代码中,我可以在调用 $object->beginSignedUploadSession() 之前看到这些语句直接停止(参见下面的代码)。
$config = [
'projectId' => 'my-project-id'
];
$storage = new StorageClient($config);
$bucket = $storage->bucket('my-project-id.appspot.com');
$object = $bucket->object('csv_data/tmpcsvdata-' . $model->file_hash . '.csv');
$upload_url = $object->beginSignedUploadSession();
这会在本地正确生成签名的上传 URL,因此我可以将其插入到视图中,然后 AJAX 负责将用户的文件上传到 GCS。实时,应用程序错误处理程序 (Yii2) 返回 Error(#403) 但它没有提供其他详细信息。 AppEngine 日志不显示除错误 500 以外的任何信息。
假设 #403 可能意味着 Forbidden 并且问题出在凭据上,我已经重新检查了这一点,但这似乎很好,因为我认为我不需要提供 keyFile 或 keyFilePath,因为它在 AppEngine 上(不像当我在本地做时)。
我进行了一些相当广泛的搜索,但找不到任何似乎相关的内容。
任何建议将不胜感激。
更新
设法获取更多错误详细信息。错误消息是“IAM Service Account Credentials API has not been used in project XXXX”,异常是“GuzzleHttp\Exception\ClientException”。所以它似乎是一个 403 Forbidden 并且我想一定是与凭据相关但我仍然不确定我应该如何解决这个问题。
【问题讨论】:
-
请检查此链接是否有相同的问题:stackoverflow.com/questions/56157511/…
-
前面的评论有误。您不应为 AppEngine 应用手动创建服务帐户。
标签: php google-app-engine google-cloud-platform google-cloud-storage