node.js - 如何创建可公开访问的文件

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

我需要将文件上传到 Google Cloud Storage 并立即公开。 我使用createWriteStream。 如果我尝试写入一个文件,并在完成后立即调用 makePublic - 我收到一条关于没有此类对象的错误。 目前,我将 setTimeout 与 makePublic 回调结合使用,但这是一种很奇怪的方法。

代码如下所示:

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 并以有保证的方式做到这一点?

最佳答案

最简单的解决方案是公开整个存储桶,然后您无需每次都尝试公开各个对象。

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

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

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

关于node.js - 如何创建可公开访问的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49328415/

相关文章:

node.js - 不满意的需求错误 : Node on app engine flex environment

apache-spark - 如何修复 GKE 上的 Spark 应用程序中的 "NullPointerException: projectId must not be null"?

django - 配置 Django 和 Google Cloud Storage?

javascript - Sequelize V5->V6 升级 : Typescript Error Property 'x' does not exist on type 'y'

google-cloud-platform - 是否可以在 GCP Logging 中显示 Airflow 日志?

tomcat - 谷歌云平台 : External IP Address isn't Accessible from Outside

docker - x509 : certificate signed by unknown authority: Google Storage in Docker

javascript - 测试时,Sinon 不会干扰我的实习生功能。 (ExpressJS)

javascript - String.replace with/and\in Nodejs 不同于 Chrome?

node.js - 在 Meteor 1.0 中加载 NPM 包?