javascript firebase云函数onFinalize触发器未预定义存储桶?

oymdgrw7  于 2023-05-27  发布在  Java
关注(0)|答案(1)|浏览(107)

有没有可能写一个firebase云函数,当一个新的fila在firebase存储中创建时触发onFinalize(但我们事先不知道确切的bucket)?
在我的firebase存储中有一个文件夹“loads”,里面有一个以load id命名的文件夹,如:

  • /loads/-Lw1UySdunYyFMrrV6tl
  • /loads/-LwisA5hkNl_uxw3k36f
  • /loads/-LwkPUm-q7wNv-wZ49Un

https://ibb.co/NnQkTyC这是存储的屏幕截图
我想触发云函数时,新的文件已被创建在这些文件夹之一。我不知道在哪里创建的文件。我不知道这是否可能。所以我需要你的建议。
我的主要目标是在云函数中合并2个PDF文件。在我的应用程序(用vuejs编写的TMS)中,我在前端使用html 2canvas/jsPDF创建了confirmationOrder.pdf,然后将其保存到storage/loads/${loadID}。之后,用户可以手动上传同一存储桶上的POD.pdf。当它发生时,我希望我的云函数将这两个PDF合并到一个新文件中(在同一个存储桶中)。但我也不知道桶的位置。
以下是我如何在前端上传PDF:

async uploadConfPDF({ commit }, payload) {
      const PDF = payload.PDF;
      const loadID = payload.loadID;
      const fileName = payload.fileName;

      const fileData = await firebase
        .storage()
        .ref(`loads/${loadID}/${fileName}.pdf`)
        .put(PDF);

      const confOrderURL = await fileData.ref.getDownloadURL();

      return confOrderURL;
    },

任何帮助是高度赞赏。抱歉,我的解释似乎不够清楚。英语不是我的母语。

g6ll5ycj

g6ll5ycj1#

修改问题后进行编辑

根据您的代码和Cloud Storage控制台的打印屏幕,您正在项目的默认存储桶中工作,其位置的URL为gs://alex-logistics.appspot.com
在云存储控制台的打印界面中可以看到,您存储桶中的文件以分层结构呈现,就像您本地硬盘上的文件系统一样。然而,这只是一种呈现文件的方式:如果存储桶中没有真正的文件夹/目录,云存储控制台只是使用文件路径的不同部分来“模拟”文件夹结构。
因此,基于上面的段落,我认为您的问题可以重新措辞为“* 在云函数中,如何提取上传到Firebase项目默认存储桶的文件路径的不同部分?*".

回答:

在文件添加到默认存储桶时触发的云函数中,可以获取文件路径如下:

exports.yourCloudFunction = functions.storage.object().onFinalize(async (object) => {

    const filePath = object.name; // File path in the bucket.

    //...

});

由于我们使用了onFinalize事件处理程序,因此您可以通过使用object对象的name属性(类型为ObjectMetadata)来获取此新文件的路径。
然后,您可以使用一些String方法,例如,从该路径中提取您在问题中引用的${loadID}

相关问题