从云功能中删除云存储中的文件

Posted

技术标签:

【中文标题】从云功能中删除云存储中的文件【英文标题】:Delete file in cloud storage from cloud functions 【发布时间】:2018-11-13 16:52:25 【问题描述】:

我正在尝试制作一个谷歌云函数,它删除链接到 Firebase 实时数据库中的人员对象的图像。但每次我收到“请求期间出错”错误(没有任何特定的 error.code,它只是未定义) )..这是一个函数代码:

const functions = require('firebase-functions');

// The Firebase Admin SDK to access the Firebase Realtime Database.
const admin = require('firebase-admin');
const gcs = require('@google-cloud/storage')( 
  projectId: "PROJ_ID",
  keyFilename: "SERV_ACC.json LOCATED IN FUNCTIONS FOLDER");

admin.initializeApp(functions.config().firebase);

exports.removePersonImage = 
functions.database.ref("users/userId/persons/personId")
 .onDelete((snapshot, context) => 
   const person = snapshot.val();    

   if (!person.photo || !person.photo.key) 
    console.log("Person doesn't have photo");
    return true;
   

   var path = "user/" + context.params.userId + "/" + person.photo.key + ".jpg";

   console.log("Bucket path: " + path);

   return gcs.bucket(path)
    .delete()
    .then(() => 
      console.log("Image " + person.photo.key + " successfully deleted");
      return true;
    )
    .catch(err => 
      console.error("Failed to remove image " + person.photo.key);
      console.error("Error: " + err.message);
      return false;
    );
);

【问题讨论】:

【参考方案1】:

我认为您正在使用文件的路径获取对 Bucket 的引用。

您应该首先创建对您的 Bucket 的引用,然后使用 Bucket 上的file() 方法来创建 File 对象。

首先从您在存储控制台中看到的根存储桶名称中声明存储桶,但没有gs://,如下所示:

const bucket = gcs.bucket("***projectname***.appspot.com");  

然后用“目录”声明你的文件。

const file = bucket.file("user/" + context.params.userId + "/" + person.photo.key + ".jpg");

然后调用delete:

return file.delete()
    .then(() => 
    ....

见https://cloud.google.com/nodejs/docs/reference/storage/1.7.x/Bucket#file

和https://cloud.google.com/nodejs/docs/reference/storage/1.7.x/Storage#bucket

【讨论】:

使用该代码我得到 404 错误“没有这样的对象”.. 文件路径是正确的.. 看起来它正在尝试查找名称为 context.params.userId + "/" + person 的文件.photo.key + ".jpg".. 还尝试将 userId 移动到 bucket() 函数中的路径.. 但在请求错误期间出错。 @Anton 我已经更新了我的答案并成功测试了它。存储桶应为根存储桶名称,而不是“用户”。 是的......看起来我也发现了,5分钟前:)......无论如何,谢谢!我的错误是我使用***文件夹作为存储桶名称。我还删除了 gcs 并使用了 firebase.admin().storage() api。而且它在不配置任何额外服务帐户的情况下工作得很好。 实际上,您必须将.appspot.com 添加到存储桶名称的事实并没有很好的记录...如果您查看cloud.google.com/nodejs/docs/reference/storage/1.7.x/…,它显示了以下示例:const bucket = storage.bucket('albums'); const file = bucket.file('my-existing-file.png'); 它给出了印象你应该使用你的***文件夹(子桶).... 为我工作,但我必须像这样导入和使用 GCS: import Storage from '@google-cloud/storage'; const gcs = new Storage();【参考方案2】:
 const storage = new Storage(
      credentials: 
        client_email: process.env.STORAGE_BUCKET_CLIENT_EMAIL,
        private_key: process.env.STORAGE_BUCKET_PRIVATE_KEY,
      ,
      projectId: process.env.STORAGE_BUCKET_PROJECT_ID,
    );

 bucket = storage.bucket(process.env.STROAGE_BUCKET_NAME);

 const imageParts = user.thumbnail.split('/');\

  bucket.file(`$imageParts[imageParts.length - 1]`)
      .delete()
      .then((res) => )
      .catch((error) => );

【讨论】:

以上是关于从云功能中删除云存储中的文件的主要内容,如果未能解决你的问题,请参考以下文章

通过云函数从云存储中读取数据

将 csv 文件从云存储加载到大查询

将 csv 文件从云存储批量加载到 bigquery

BigQuery 错误从云存储传输 csv

云函数可以从云存储中读取吗?

从云存储桶加载数据时未找到数据集错误