Firebase 函数上传到存储

Posted

技术标签:

【中文标题】Firebase 函数上传到存储【英文标题】:Firebase function upload to storage 【发布时间】:2021-03-30 00:02:16 【问题描述】:

我正在尝试使用 Firebase 云功能将图像上传到存储中。 当我从浏览器运行该函数时,我收到一个“0”响应,表明它失败了。 之后我检查日志并显示错误:

上传不好! [错误:ENOENT:没有这样的文件或目录,stat 'https://i2.wp.com/lifemadesimplebakes.com/wp-content/uploads/2018/03/How-To-Make-Fruit-Salad-680x680.jpg ']

图片网址确实存在。所以我想知道为什么它不起作用? 这是我的整个云功能:

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


exports.uploadTest = functions.https.onRequest(async (request, response) => 
    const url = 'https://i2.wp.com/lifemadesimplebakes.com/wp-content/uploads/2018/03/How-To-Make-Fruit-Salad-680x680.jpg';
    
    admin.initializeApp();
    
    const bucket = admin.storage().bucket('my-bucket.appspot.com');

    bucket.upload(url, 
        destination: "myFolder/myFile.png"
    ).then(() => 
        console.log("Upload good!");
        response.send('1');
        return true
    ).catch(err => 
        console.error("Upload bad!", err);
        response.send('0');
    );
)

【问题讨论】:

【参考方案1】:

Cloud Storage 不支持直接从某个 URL 上传内容。 upload() 不接受 URL。它需要一个本地文件的路径。

因此,您必须编写代码以在本地下载 URL 的内容,然后将其作为对象上传到 Cloud Storage。您还可以使用 SDK 将下载内容流式传输到存储中。请参阅createWriteStream()。我建议研究node streams 的工作原理,以便有效地实现这一点。

【讨论】:

嗨,Doug,感谢您提供的重要信息,我不知道它没有获取 URL。如果我从前端获取图像,是否可以将其作为参数传递给函数,然后函数可以将其与该数据一起上传? 当然,你可以试试。 我是否可以将图像作为 base64 字符串传递给我的云函数,然后使用 createWriteStream 将图像解码到存储?我可以使用admin.storage.bucket.file.save 上传到我的存储桶,但只是努力将其保存为正确的图像! 你也可以试试。如果您的代码无法按预期方式运行,请在新问题中单独发布。【参考方案2】:

所以经过更多研究后,我找到了一些工作。 在我的前端,我将图像编码为 base64,我将其作为参数imgData 传递给我的云函数。然后在函数内部检索它,用数据创建一个Buffer,然后使用File.save 将它上传到我的存储桶中。 现在它上传了,如果我从控制台下载它的 url 并在浏览器上检查它,图像就会按预期显示。

我的前端需要使用 REST,所以我根本无法使用 Firebase 的 sdk,这可能会让这变得更容易。

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

admin.initializeApp();


exports.uploadTest = functions.https.onRequest(async (request, response) => 
    const imgData = request.body.imgData;
    
    const bucket = admin.storage().bucket('my-bucket.appspot.com');
    const file = bucket.file('myFolder/myFile.jpg');

    var imgBuffer = new Buffer.from(imgData, 'base64')

    await file.save(imgBuffer, 
        contentType: 'image/jpeg'
    ).catch(err => 
        console.error("Upload bad!", err);
        response.send('0');
    );

    response.send('1');
)

以下是一些帮助我的信息: https://groups.google.com/g/firebase-talk/c/aDJvYyNIJik?pli=1

【讨论】:

以上是关于Firebase 函数上传到存储的主要内容,如果未能解决你的问题,请参考以下文章

将 stripeCharge 函数上传到 Firebase 云函数不起作用

无法上传到 Firebase 存储/权限被拒绝

如何将配置文件链接上传到 Firebase 数据库

从 firebase 存储下载 url 为空

使用 firebase 功能将图像上传到云存储错误

使用 Firebase 函数获取上传到 Firebase 存储的 pdf 的签名下载 URL