如何在 Node.js 中向 Google Cloud Storage 报告上传进度

问题描述 投票:0回答:1

我正在使用 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!"
        })
    }
})
node.js google-cloud-storage gcs
1个回答
0
投票

最后我使用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!"
        })
    }
})
© www.soinside.com 2019 - 2024. All rights reserved.