busboy
的帮助下,我试图将FileStream
保存到Firebase存储桶中。
代码:
const admin = require('firebase-admin');
const userFilesBucket = admin.storage().bucket(USER_FILES_BUCKET_NAME);
function handlePost(req, res){
const busboy = new Busboy({ headers: req.headers })
busboy.on('file', function(fieldname, file, filename, encoding, mimetype) {
file.on('data', function(data) {
});
file.on('end', function() {
uploadFile({filename: filename, file:file, mimetype:mimetype})
.catch(err => {
console.log("attemptFileUpload | err:", err)
reject(err)
});
});
});
}
function uploadFile(fileContainer){
const filePath = fileContainer.filename
const file = userFilesBucket.file(filePath);
file.save(fileContainer.file, function(err) {
if (!err) console.log('Sucess | uploaded a blob or file!');
});
}
这将成功完成,并且文件已保存到存储桶中,但同时上述Promise捕获到异常:
The "chunk" argument must be one of type string or Buffer. Received type object
以及文件已损坏。此错误告诉我应该将FileStream转换为Buffer吗?
我还要注意,fileContainer.file
的类型为FileSream。
谢谢。
解决方案非常简单,我错过了busboy文档。
需要使用busboy的file.on(data)
侦听器作为Buffer来访问文件数据,而不是将原始传入文件作为FileStream来访问。
busboy.on('file', function(fieldname, file, filename, encoding, mimetype) {
file.on('data', data => {
uploadFile({filename: filename, file:data, mimetype:mimetype})
.catch(err => {
console.log("attemptFileUpload | err:", err)
});
});
file.on('end', function() {
// move from here, up to file.on(data)
});
});