【发布时间】:2021-04-23 23:55:06
【问题描述】:
我正在尝试使用 admin sdk 获取将 1 分钟视频上传到 Firebase 存储桶存储的进度。我已经看到很多关于使用 firebase.storage().ref.child ..... 但我无法使用 admin sdk 来做到这一点,因为它们没有相同的功能。这是我上传的文件:
exports.uploadMedia = (req, res) => {
const BusBoy = require('busboy');
const path = require('path');
const os = require('os');
const fs = require('fs');
const busboy = new BusBoy({ headers: req.headers, limits: { files: 1, fileSize: 200000000 } });
let mediaFileName;
let mediaToBeUploaded = {};
busboy.on('file', (fieldname, file, filename, encoding, mimetype) => {
if(mimetype !== 'image/jpeg' && mimetype !== 'image/png' && mimetype !== 'video/quicktime' && mimetype !== 'video/mp4') {
console.log(mimetype);
return res.status(400).json({ error: 'Wrong file type submitted, only .png, .jpeg, .mov, and .mp4 files allowed'})
}
// my.image.png
const imageExtension = filename.split('.')[filename.split('.').length - 1];
//43523451452345231234.png
mediaFileName = `${Math.round(Math.random()*100000000000)}.${imageExtension}`;
const filepath = path.join(os.tmpdir(), mediaFileName);
mediaToBeUploaded = { filepath, mimetype };
file.pipe(fs.createWriteStream(filepath));
file.on('limit', function(){
fs.unlink(filepath, function(){
return res.json({'Error': 'Max file size is 200 Mb, file size too large'});
});
});
});
busboy.on('finish', () => {
admin
.storage()
.bucket()
.upload(mediaToBeUploaded.filepath, {
resumable: false,
metadata: {
metadata: {
contentType: mediaToBeUploaded.mimetype
}
}
})
.then(() => {
const meadiaUrl = `https://firebasestorage.googleapis.com/v0/b/${config.storageBucket}/o/${mediaFileName}?alt=media`;
return res.json({mediaUrl: meadiaUrl});
})
.catch((err) => {
console.error(err);
return res.json({'Error': 'Error uploading media'});
});
});
req.pipe(busboy);
}
目前这可以正常工作,但唯一的问题是用户无法看到他们上传的 1 或 2 分钟视频的位置。目前,它只是一个活动指示器,用户只是坐着等待,没有任何通知。如果有任何帮助,我会在前端使用本机反应。非常感谢任何帮助!
【问题讨论】:
-
想完全理解您的问题,您正在将nodeJS中的后端文件上传到云存储,并希望在前端显示上传进度对吗?
-
@SoniSol 完全正确
-
您能否向我们展示您负责上传的 React Native 代码。显示进度的逻辑必须在客户端实现。
-
这就是问题所在,我宁愿没有任何客户端代码用于此上传,但事实证明我可能需要。
-
您绝对必须有一个客户端代码才能进行此上传。您想在客户端显示它,只有客户端知道如何显示和显示什么。
标签: node.js react-native google-cloud-storage firebase-storage firebase-admin