我正在使用 Node.js 将文件上传到 Google Cloud Storage,需要实现一种向用户报告上传进度的方法。我一直在使用 @google-cloud/storage 库来处理文件上传,但尚未找到用于跟踪和报告上传进度的明确解决方案。该库是否提供任何我可以监听进度更新的挂钩或事件?如果是这样,我如何将它们集成到我现有的文件上传代码中?任何代码片段或指导将不胜感激。
router.post("/upload-file", multer.single("file"), async (req, res, next) => {
try{
const folderPath = `Files/`;
const blob = retmBucket.file(folderPath + req.file.originalname);
const blobStream = blob.createWriteStream();
// TO DO
blobStream.on('data', () => {
// console.log(progress);
});
// =================
blobStream.on("error", (error) => {
res.status(500).json({
message: "Error during file upload!",
error: error.message
});
});
blobStream.on("finish", async () => {
res.status(200).json({
message: "File has been uploaded sucessfully",
data: fileName
})
})
blobStream.end(req.file.buffer);
}catch{
res.status(409).json({
message: "Error during file upload!"
})
}
})
最后我使用ReadableStreamBuffer解决了这个问题
希望我的解决方案有帮助!
router.post("/upload-file", multer.single("file"), async (req, res, next) => {
try{
const folderPath = `Files/`;
const blob = retmBucket.file(folderPath + req.file.originalname);
const blobStream = blob.createWriteStream();
const fileSize = req.file.size; // Total size of the file
let uploadedBytes = 0;
// Pipe the file buffer to the blob stream
const fileBufferStream = new ReadableStreamBuffer();
fileBufferStream.put(req.file.buffer);
fileBufferStream.stop();
fileBufferStream.on('data', (chunk) => {
uploadedBytes += chunk.length;
progress = ((uploadedBytes / fileSize) * 100).toFixed(2);
console.log(`Progress: ${progress}%`);
});
fileBufferStream.pipe(blobStream)
.on("error", (error) => {
res.status(500).json({
message: "Error during file upload!",
error: error.message
});
})
.on("finish", async () => {
res.status(200).json({
message: "File has been uploaded sucessfully",
data: fileName
})
});
}catch{
res.status(409).json({
message: "Error during file upload!"
})
}
})