我需要将文件上传到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并以保证的方式执行此操作?
答案 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。