Google app engine 无法将gs://文件公开,以便直接从Google存储提供服务

Google app engine 无法将gs://文件公开,以便直接从Google存储提供服务,google-app-engine,google-cloud-platform,google-cloud-storage,Google App Engine,Google Cloud Platform,Google Cloud Storage,我想能够直接从谷歌存储服务图像文件。我正在跟踪,但仍有访问被拒绝和匿名调用方没有storage.objects.get Access。我在我的Google应用程序引擎项目中运行此功能: require_once 'vendor/autoload.php'; use Google\Cloud\Storage\StorageClient; use google\appengine\api\cloud_storage\CloudStorageTools; $storage = new Storag

我想能够直接从谷歌存储服务图像文件。我正在跟踪,但仍有
访问被拒绝
匿名调用方没有storage.objects.get Access
。我在我的Google应用程序引擎项目中运行此功能:

require_once 'vendor/autoload.php';

use Google\Cloud\Storage\StorageClient;
use google\appengine\api\cloud_storage\CloudStorageTools;

$storage = new StorageClient();
$storage->registerStreamWrapper();

$text = "Contained text: ".date("Y-m-d H:i:s")."\n";

$options = ['gs' => ['acl' => 'public-read']];
$context = stream_context_create($options);
$filepath = "gs://$project.appspot.com/public_file.txt";
file_put_contents($filepath, $text, 0, $context);

$publicurl = CloudStorageTools::getPublicUrl($filepath, false);
该文件正在成功写入Google存储。我已经通过云控制台中的存储浏览器查看了它

但是当我试图浏览到它时,我得到了
访问被拒绝的消息。我错过了什么


我不知道为什么上面的代码无法将权限设置为public,但这里有一个解决方法

如果您使用的是完全公开的bucket,那么您可以做的是将bucket上的默认ACL设置为
public read
,那么无论何时在该bucket中创建文件,它们都将是公开的

下面是我从中获得命令的地方:


gsutil defacl set public read gs://[YOUR-PROJECT-ID]

我假设您从公共URL访问对象时出错。乍一看,这可能是由于对象的可见性未正确设置为公共。您能指定您正在使用的代码示例的链接吗?因此,也许我能够重现这个问题。@Maxim这是谷歌代码示例:Kenny,使用
gsutil
确定为您的文件设置了哪些权限。更改以下命令以匹配bucket和对象路径:
gsutil acl get gs://mybucket/myobject
。要使此对象公开,需要在acl策略中指定读取者。我有一种感觉,
allUsers
已经设置好了,但另一个bucket acl正在覆盖它。策略将包含以下内容:{|“bindings”:[{“members”:[“alluser”],“role”:“roles/storage.legacyBucketReader”}下面是我给出的StackOverflow答案,用于解释对象为何为公共对象。这可能有助于您了解对象为何为非公共对象:通过运行您提供的代码,我在上载文件并将其公开方面没有任何问题。尽管如此,我还是通过从ACL中删除
allUsers
条目来重现此问题。正如John说,问题是该文件在ACL中没有设置
allUsers:R
条目,因此不允许公众访问该文件。运行以下命令修改该文件的ACL:
gsutil ACL ch-u allUsers:R gs://project.appspot.com/public_file.txt
是否对您上载的每个文件都会发生这种情况?
$ gsutil acl get gs://my-app-project.appspot.com/public_file.txt

[
  {
    "entity": "project-owners-XXXXXXXXXXXX",
    "projectTeam": {
      "projectNumber": "XXXXXXXXXXXX",
      "team": "owners"
    },
    "role": "OWNER"
  },
  {
    "entity": "project-editors-XXXXXXXXXXXX",
    "projectTeam": {
      "projectNumber": "XXXXXXXXXXXX",
      "team": "editors"
    },
    "role": "OWNER"
  },
  {
    "entity": "project-viewers-XXXXXXXXXXXX",
    "projectTeam": {
      "projectNumber": "XXXXXXXXXXXX",
      "team": "viewers"
    },
    "role": "READER"
  },
  {
    "email": "my-app-project@appspot.gserviceaccount.com",
    "entity": "user-my-app-project@appspot.gserviceaccount.com",
    "role": "OWNER"
  }
]