How to upload multiple files to Firebase?

前端 未结 8 1845
既然无缘
既然无缘 2020-12-04 16:44

Is there a way to upload multiple files to Firebase storage. It can upload single file within single attempt as follows.

fileButton.addEventListener(\'chang         


        
相关标签:
8条回答
  • 2020-12-04 17:44

    Firebase Storage uses Promise, so you can use Promises to achieve it.

    Here's the firebase blog article that covers this subject: Keeping our Promises (and Callbacks)


    Give Promise.all() an "Array of Promises"

    Promise.all(
      // Array of "Promises"
      myItems.map(item => putStorageItem(item))
    )
    .then((url) => {
      console.log(`All success`)
    })
    .catch((error) => {
      console.log(`Some failed: `, error.message)
    });
    

    Upload each file and return a Promise

    putStorageItem(item) {
      // the return value will be a Promise
      return firebase.storage().ref("YourPath").put("YourFile")
      .then((snapshot) => {
        console.log('One success:', item)
      }).catch((error) => {
        console.log('One failed:', item, error.message)
      });
    }
    

    YourPath and YourFile can be carried with myItems array (thus the item object).

    I omitted them here just for readability, but you get the concept.

    0 讨论(0)
  • 2020-12-04 17:50

    all the promises get messy pretty quickly, why not use async and await instead?

    Here, I have a function that keep tracks of all the images selected from the input/file control to be uploaded:

    let images =[];
    let imagePaths=[];
    
    const trackFiles =(e)=>{
        images =[];
        imagePaths =[];
        for (var i = 0; i < e.target.files.length; i++) {
            images.push(e.target.files[i]);
        }
    }
    

    And I have another function that will be triggered by a button that the user will click on when ready to do the actual upload:

    const uploadFiles =()=>{
        const storageRef = storage.ref();
    
        images.map(async img =>{
            let fileRef = storageRef.child(img.name);
            await fileRef.put(img);
            const singleImgPath = await fileRef.getDownloadURL();
            imagePaths.push(singleImgPath);
    
            if(imagePaths.length == images.length){
                console.log("got all paths here now: ", imagePaths);
            }
        })
    }
    

    We basically loop through each image and perform the upload, and push the image paths into a separate imagePaths array one by one as each of them gets finished at its own pace, I then grab all the paths once we know they are all done by comparing the length of the images and their final paths.

    0 讨论(0)
提交回复
热议问题