【问题标题】:Get progress of firebase admin file upload获取 Firebase 管理文件上传的进度
【发布时间】: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


【解决方案1】:

我能够更轻松地在客户端实现...但它与图像和视频上传进度完美配合。在后端,我使用的是 admin sdk,但前端我最初使用的是 firebase sdk。

        this.uploadingMedia = true;
        const imageExtension = this.mediaFile.split('.')[this.mediaFile.split('.').length - 1];
        const mediaFileName = `${Math.round(Math.random()*100000000000)}.${imageExtension}`;
        const response = await fetch(this.mediaFile);
        const blob = await response.blob();
        const storageRef = storage.ref(`${mediaFileName}`).put(blob);
        storageRef.on(`state_changed`,snapshot=>{
          this.uploadProgress = (snapshot.bytesTransferred/snapshot.totalBytes);
        }, error=>{
          this.error = error.message;
          this.submitting = false;
          this.uploadingMedia = false;
          return;
        },
        async () => {
          storageRef.snapshot.ref.getDownloadURL().then(async (url)=>{
            imageUrl = [];
            videoUrl = [url];
            this.uploadingMedia = false;
            this.submitPost(imageUrl, videoUrl);
          });
        });

【讨论】:

    【解决方案2】:
    export const uploadFile = (
      folderPath,
      fileName,
      file,
      generateDownloadURL = true,
      updateInformationUploadProgress
    ) => {
      return new Promise((resolve, reject) => {
        try {
          const storageRef = firebaseApp.storage().ref(`${folderPath}/${fileName}`)
          const uploadTask = storageRef.put(file)
    
          uploadTask.on(
            'state_changed',
            snapshot => {
              if (updateInformationUploadProgress) {
                const progress =
                  (snapshot.bytesTransferred / snapshot.totalBytes) * 100
                updateInformationUploadProgress({
                  name: fileName,
                  progress: progress,
                })
              }
            },
            error => {
              console.log('upload error: ', error)
              reject(error)
            },
            () => {
              if (generateDownloadURL) {
                uploadTask.snapshot.ref
                  .getDownloadURL()
                  .then(url => {
                    resolve(url)
                  })
                  .catch(error => {
                    console.log('url error: ', error.message)
                    reject(error)
                  })
              } else {
                resolve(uploadTask.snapshot.metadata.fullPath)
              }
            }
          )
        } catch (error) {
          reject(error)
        }
      })
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-18
      • 1970-01-01
      • 1970-01-01
      • 2021-10-09
      • 1970-01-01
      • 2010-11-02
      • 1970-01-01
      • 2018-06-30
      相关资源
      最近更新 更多