Firebase函数上传到存储器



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

上传错误![错误:ENOENT:没有这样的文件或目录,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');
});
})

所以经过更多的研究,我找到了工作。在我的前端,我将一个图像编码为base64,并将其作为参数imgData传递给我的云函数。然后在函数中检索它,用数据创建一个Buffer,然后使用File.save将它上传到我的bucket中。现在它上传了,如果我从控制台下载它的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

云存储不支持直接从某些URL上传内容。upload((不接受URL。它获取一个本地文件的路径。

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

最新更新