如何使用node.js将文件(由用户选择)上传到Firebase Storage



我正在处理一个需要以下功能的项目(web、node.js、Firebase函数、托管和存储(:

  • 用户通过
<input type="file" multiple>
  • other按钮运行一个脚本,该脚本旨在将选定的文件上载到存储器

问题是-根据node.js的谷歌存储管理员的文档,文件只能使用路径上传,例如:

const options = {
destination: bucket.file('existing-file.png'),
resumable: false
};
bucket.upload('local-img.png', options, function(err, newFile) {
// Your bucket now contains:
// - "existing-file.png" (with the contents of `local-img.png')
}); 

但是文件输入字段不允许让浏览器知道确切的路径是什么。它让我知道:

  • 文件名
  • 文件URL(URL.createObjectURL(…(-»";blob:https://mis..."(
  • 文件本身作为blob

总结一下,页面无法移交上传机制可以处理的变体。

有人知道怎么做吗?

谷歌功能调用:


var imageSelected = document.getElementById("imageSelected");
var imageList = imageSelected.files;
var imagePath = imageList.webkitRelativePath;
for (var i = 0; i < imageList.length; i++) {
imageFile = imageList[i];
imageFileURL = URL.createObjectURL(imageFile).toString();

var imageUpload = firebase.functions().httpsCallable('imageUpload');
imageUpload({ file: imageFile, fileName: imageFile.name, filePath: imageFileURL });
URL.revokeObjectURL(imageFileURL)
}        

功能:

exports.imageUpload = functions.https.onCall((data, context) => {
const storage = new Storage();
var filePath = data.filePath;
var fileName = data.fileName;
var file = data.file;
const options = {
destination: bucket.file('TEST/' + fileName),
resumable: false
};
return new Promise((Resolve, Reject) => {
async function uploadFile() {
storage
.bucket("..............appspot.com")
.upload(file, options);
Resolve(fileName);
}
uploadFile().catch(error => {
Reject(error);
});
});
});

这里的问题是,您试图用云函数上传文件,就好像云函数可以访问本地文件系统中的文件一样,而该文件系统不在服务器端。

您需要做的是将文件以base64编码为字符串,并将该字符串放入JSON负载中,然后在函数中对其进行解码,以便上传文件。请注意,这只建议用于小文件。

如果您需要对更大的文件执行此操作,那么更好的选择是在您的客户端中执行上载,然后客户端可以访问您的本地文件系统,使用客户端SDK而不是管理SDK。

相关内容

  • 没有找到相关文章