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 函数上传到存储的主要内容,如果未能解决你的问题,请参考以下文章