如何创建具有公共访问权限的文件

时间:2018-03-16 19:43:43

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

我需要将文件上传到Google云端存储并立即公开。 我使用createWriteStream。 如果我尝试写一个文件并在完成后立即调用makePublic - 我得到一个关于没有这样的对象的错误。 现在,我使用带有makePublic回调的setTimeout,但这是一种hacky方式。

代码如下所示:

const name = 'folder/file.jpg'
const fileRef = bucket.file(name)

const save = (stream, name, meta) => 
  new Promise((resolve, reject) => {
    stream
      .on('error', (error) => reject(error)})
      .on('end', () => resolve(name))
      .pipe(fileRef.createWriteStream({
        metadata: meta,
      }))
  })

save(yourReadStream(), name, yourMetaObj)
.then(() => {
  setTimeout(() => {
    fileRef.makePublic()
  }, 1500)
})

如何避免使用setTimeout并以保证的方式执行此操作?

2 个答案:

答案 0 :(得分:0)

最简单的解决方案是公开整个存档,然后您不需要每次都尝试公开个别对象。

https://cloud.google.com/storage/docs/gsutil/commands/iam#ch

gsutil iam ch allUsers:objectViewer gs://ex-bucket

注意:这将使存储桶中的所有对象公开可读。如果您在该存储桶中有无法公开的对象,那么我建议创建一个单独的存储桶来保存公共对象。

答案 1 :(得分:0)

可以使用gsutil在对象级别允许公共访问。

您可以运行以下命令来仅更改对象的权限,并对存储桶和该存储桶中的其他对象保持严格权限:

gsutil acl ch -u AllUsers:R gs://[BUCKET_NAME]/[OBJECT_NAME]

更多信息可以是found here