Nodejs Google云存储在访问公共网址时返回403

时间:2017-04-10 21:52:18

标签: node.js google-app-engine google-cloud-platform google-cloud-storage

我正在将个人资料图片上传到Google云端商店(工作正常)并尝试将所有图片公开提供,但是当我在img src中使用或刚粘贴时,我仍然从返回的网址中收到403错误它在浏览器中,返回的URL如下所示:

https://storage.googleapis.com/my_bucket_name/12370691_1205162746164520_2152367844899316112_o.jpg

并出现以下错误:

Anonymous users does not have storage.objects.get access to object my_bucket_name/15991995_384418798568801_734448169_o.jpg.
  

注意:my_bucket_name不是真正的存储桶名称,它只是一个占位符   这篇文章

以下代码显示了我如何设置谷歌云存储:

const gcs = require('@google-cloud/storage')({
  projectId: ‘my_project_id’,
  keyFilename: './routes/to/my/keyfile.json'
});

const bucket = gcs.bucket(‘my_bucket_name’);

const options = {
  entity: 'allUsers',
  role: gcs.acl.READER_ROLE
};

bucket.acl.add(options, (err, aclObject) => {
  console.log(err); //null
  console.log(aclObject); //{ entity: 'allUsers', role: 'READER' }
});

function getPublicUrl(filename) {
  return `https://storage.googleapis.com/${bucketName}/${filename}`;
}

... code for uploading the image below, (works fine)

1 个答案:

答案 0 :(得分:0)

使用bucket.acl.add更改bucket.acl.update通过使存储桶可公开读取来解决问题,运行此代码一次就足以更改默认存储区的ACL权限,您可以在以后删除代码:

const options = {
  entity: 'allUsers',
  role: gcs.acl.READER_ROLE
};

bucket.acl.update(options, (err, aclObject) => {
  console.log(err); //null
  console.log(aclObject); //{ entity: 'allUsers', role: 'READER' }
});

注意:使用以下方法可以完成相同的操作:

gsutil defacl set public-read gs://[YOUR-BUCKET-NAME]

如果您不想让整个桶可读,即url / bucket_name,并且只想让桶内的文件可读,那么您需要将文件配置为匿名用户在文件写入时可读时间如下图所示:

  const remoteWriteStream = file.createWriteStream({
    metadata: {
      contentType: req.file.mimetype
    },
    predefinedAcl: "publicRead"
  });