我在这里不知所措。我的节点代码成功将文件上传到gcloud存储,但似乎无法公开文件甚至更改acl。
事实是该文件是用gcloud存储编写的,但不能公开相同的文件。
返回的错误是
{[ApiError:权限不足] 错误: [{domain:' global', 原因:'不足的承诺', 消息:'权限不足' }], 代码:403, 消息:'权限不足', 响应:未定义}
这是我的代码(假设此代码位于STREAM ergo stdout.pipe内)
var gcs = GLOBAL.gcloud.storage();
var bucket = gcs.bucket(GLOBAL.storage_names.products);
var file = bucket.file('images/'+targetValue+'_'+filename);
stdout.pipe(file.createWriteStream())
.on('error', function(err) {
var msg = {
"status":"Error"
"err":err
};
console.log(msg);
})
.on('finish', function() {
// The file upload is complete.
console.log("Successfully uploaded "+targetValue+'_'+filename);
file.acl.add({
entity: 'allUsers',
role: gcs.acl.READER_ROLE
}, function(err, aclObject) {
if(err==null)
{
//stream upload file
file.makePublic();
}else{
console.log("ERROR in ACL Adding");
console.log(err)
}
});
file.makePublic(function(err, apiResponse) {
if(err==null)
{
console.log("File made public");
}else{
console.log("make public error");
console.log(err);
}
});
});
答案 0 :(得分:4)
虽然代码没有完全显示问题,但这可能会有所帮助:WRITER bucket 权限可以创建对象,但您需要OWNER object 权限才能更改现有的ACL对象。此外,对象的创建者不会自动被授予OWNER 对象权限(即使他们是存储桶的所有者) - 如果您在创建时未指定predefined ACL对象,Google云端存储始终将存储桶的default object ACL应用于新创建的对象。
因此,两个可能的修复方法是(1)提前在存储桶上设置默认的对象 ACL,以将您的应用程序凭据包含为OWNER,或者(2)提供预定义的ACL(例如'publicRead') )在对象创建时,而不是在之后更改它。