【问题标题】:Firebase function upload to storageFirebase 函数上传到存储
【发布时间】: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');
    });
})

【问题讨论】:

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


    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-10
      • 1970-01-01
      • 2020-05-14
      • 2018-07-06
      • 2020-11-20
      • 2020-01-06
      • 1970-01-01
      • 2017-01-10
      相关资源
      最近更新 更多