3

我在这里不知所措。我的节点代码已成功将文件上传到 gcloud 存储,但似乎无法公开文件,甚至无法更改 acl。

事实是该文件已写入 gcloud 存储,但无法将同一文件公开。

返回的错误是

{ [ApiError: Insufficient Permission] 错误:[ { 域:'global',原因:'insufficientPermissions',消息:'Insufficient Permission'}],代码:403,消息:'Insufficient Permission',响应:未定义}

这是我的代码(假设此代码在 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);
      }
    });
  });
4

1 回答 1

4

虽然代码没有直接显示问题,但这可能会有所帮助:WRITER存储桶权限可以创建对象,但您需要 OWNER对象权限才能更改现有对象的 ACL。此外,对象的创建者不会自动获得 OWNER对象权限(即使他们是存储桶的所有者) - 如果您在创建对象时未指定预定义 ACL,Google Cloud Storage 将始终应用存储桶的默认值对象 ACL到新创建的对象。

因此,两个可能的修复方法是(1)提前在存储桶上设置默认对象ACL,以将您的应用程序凭据包含为 OWNER,或者(2)在对象创建时提供预定义的 ACL(例如“publicRead”),而不是事后更改它.

于 2015-12-14T00:23:05.130 回答