Node.js Firebase功能上载到存储器

Node.js Firebase功能上载到存储器,node.js,firebase,google-cloud-functions,firebase-storage,Node.js,Firebase,Google Cloud Functions,Firebase Storage,我正在尝试使用Firebase云函数将图像上载到存储器。 当我从浏览器运行该函数时,我收到一个“0”响应,指示它失败。 之后,我检查日志,它显示错误: 上传不好![错误:enoint:没有这样的文件或目录,stat'https://i2.wp.com/lifemadesimplebakes.com/wp-content/uploads/2018/03/How-To-Make-Fruit-Salad-680x680.jpg“]{ 但是图像url确实存在。所以我想知道为什么它不起作用? 以下是我的整

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

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

但是图像url确实存在。所以我想知道为什么它不起作用? 以下是我的整个云功能:

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');
    });
})

云存储不支持直接从某个URL上载内容。不采用URL。它采用本地文件的路径


因此,您必须编写代码在本地下载URL的内容,然后将其作为对象上载到云存储。您也可以使用SDK将下载的内容流式传输到存储中。请参阅。我建议研究如何有效地实现这一点。

因此,在进一步研究之后,我有些事要做。 在我的前端,我正在将一幅图像编码到base64,并将其作为参数
imgData
传递给我的云函数。然后在函数内部检索它,用数据制作一个
缓冲区
,然后使用
文件将其上载到我的存储桶中。保存
。
现在它上传了,如果我从控制台下载它的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');
})
以下是一些帮助我前进的信息:

你好,道格,谢谢你提供的精彩信息,我不知道它没有使用URL。如果我从前端获取图像,我是否能够将其作为参数传递给函数,然后函数可以将其与数据一起上载?当然,你可以尝试一下。我是否可以将图像作为base64字符串传递给我的云函数,然后使用
CreateWriteStreamm
要将图像解码到存储器中吗?我可以使用
admin.storage.bucket.file.save
上传到我的bucket,但只是努力将其保存为正确的图像!你也可以尝试一下。如果你的代码无法按预期方式工作,请在新问题中单独发布。