首页 > 解决方案 > 无法从 firebase 云功能将图像上传到 cloudinary

问题描述

根据 cloudinary 的文档,应该能够使用谷歌云存储将图像上传到 cloudinary。

但是,当我尝试这样做时,我的云函数日志中出现以下错误。

ENOENT: no such file or directory, open 'gs://my-bucket.appspot.com/01.jpg'

这是我的云功能:

import * as functions from 'firebase-functions';
import * as cloudinary from 'cloudinary';

cloudinary.config({
  cloud_name: functions.config().cloudinary.cloudname,
  api_key: functions.config().cloudinary.apikey,
  api_secret: functions.config().cloudinary.apisecret,
});


export const uploadImageToCloudinary = functions.storage
  .object()
  .onFinalize(object => {
    cloudinary.v2.uploader.upload(
      `gs://${object.bucket}/${object.name}`,
      function(error, result) {
        if (error) {
          console.log(error)
          return;
        }
        console.log(result);
      }
    );
  })

我已添加/.wellknown/cloudinary/<cloudinary_cloudname>到我的存储桶中,并在云平台中添加了允许云object viewer访问的权限

我是否缺少额外的步骤-我似乎无法正常工作?!

标签: firebasegoogle-cloud-functionscloudinary

解决方案


Cloudinary 确实支持 Google 云存储上传,但它是一个相对较新的功能,并且当前版本的节点 SDK 不处理gs://url。

在您的示例中,它尝试解析gs://本地服务器上的 URL 并将图像发送到 Cloudinary,而不是将 URL 发送到 Cloudinary,以便从 Cloudinary 端进行获取。

在将其添加到 SDK 之前,您可以通过使用基于 URL 的上传方法触发 fetch或对 SDK 代码进行少量更改来使其正常工作。

具体来说,这是一个小的变化lib/uploader.js- 您需要在其中添加gs:前缀,之后它应该可以正常工作。

差异:

diff --git a/lib/uploader.js b/lib/uploader.js
index 2f71eaa..af08e14 100644
--- a/lib/uploader.js
+++ b/lib/uploader.js
@@ -65,7 +65,7 @@
     return call_api("upload", callback, options, function() {
       var params;
       params = build_upload_params(options);
-      if ((file != null) && file.match(/^ftp:|^https?:|^s3:|^data:[^;]*;base64,([a-zA-Z0-9\/+\n=]+)$/)) {
+      if ((file != null) && file.match(/^ftp:|^https?:|^gs:|^s3:|^data:[^;]*;base64,([a-zA-Z0-9\/+\n=]+)$/)) {
         return [
           params, {
             file: file

应用该差异后,我确实成功地从 Google Cloud Storage 获取了一张图片


推荐阅读