【问题标题】:How to mark a file private before it's uploaded to Google Cloud Storage?如何在将文件上传到 Google Cloud Storage 之前将其标记为私有?
【发布时间】:2021-04-02 21:30:35
【问题描述】:

我正在使用@google-cloud/storage 包并生成签名的 url 来上传文件,如下所示:

const path = require("path");
const { Storage } = require("@google-cloud/storage");
const GOOGLE_CLOUD_KEYFILE = path.resolve(
  __dirname + "/../gcloud_media_access.json"
);

const storage = new Storage({
  keyFilename: GOOGLE_CLOUD_KEYFILE,
});
exports.uploadUrlGCloud = async (bucketName, key, isPrivate = false) => {

  let bucket = storage.bucket(bucketName);
  let file = bucket.file(key);

  const options = {
    version: "v4",
    action: "write",
    expires: Date.now() + 15 * 60 * 1000 // 15 minutes
  };
  

  let signedUrl = (await file.getSignedUrl(options))[0];
  if(isPrivate){
    await file.makePrivate({strict: true});
  }

  return signedUrl;
};

但是当我这样调用这个函数时:

const url = await uploadUrlGCloud(bucket, key, true);

我收到这样的 404 api 错误:

ApiError: No such object: testbucket/account/upload/4aac0fb0-92dd-11eb-8723-6b3ad09f80fa_demo.jpg

我想问的是有没有办法生成signedUrl private?在文件上传之前,我想将其标记为私有并阻止公共访问。

编辑:

我将文件上传到创建的签名 URL,并再次将 makePrivate 设置为上传的文件。这次我没有收到任何错误。但是,当我再次检查该文件时,我意识到它仍然是公开的。

这是我尝试将文件设为私有的功能:

const makeFilePrivate = async (bucketName, key) => {

  return new Promise((resolve, reject) => {

    let bucket = storage.bucket(bucketName);
    let file = bucket.file(key);
  
    try {
  
      file.makePrivate({strict: true}, err => {
        
        if(!err) {
          resolve(file.isPublic());
        } else
        reject(err);

      })
  
    } catch (err) {
  
      reject(err);
  
    }

  }) 
};
console.log(await makeFilePrivate(bucket, remotePath));
// True

【问题讨论】:

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


    【解决方案1】:

    由于IAMACLs 相互交互的方式,您无法将公共存储桶的对象设为私有。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-23
      • 1970-01-01
      • 2016-08-28
      • 2019-06-04
      • 1970-01-01
      • 2014-01-05
      • 2020-01-16
      相关资源
      最近更新 更多