Nano Hash - криптовалюты, майнинг, программирование

Как загрузить несколько файлов в Firebase?

Есть ли способ загрузить несколько файлов в хранилище Firebase. Он может загрузить один файл за одну попытку следующим образом.

fileButton.addEventListener('change', function(e){ 
//Get file
var file = e.target.files[0];

//Create storage reference
var storageRef = firebase.storage().ref(DirectryPath+"/"+file.name);

//Upload file
var task = storageRef.put(file);

//Update progress bar
  task.on('state_changed',
    function progress(snapshot){

        var percentage = snapshot.bytesTransferred / snapshot.totalBytes * 100;
        uploader.value = percentage;
    },
    function error(err){

    },
    function complete(){
        var downloadURL = task.snapshot.downloadURL;

    }
  );

});

Как загрузить несколько файлов в хранилище Firebase.


  • Когда вы выбираете несколько файлов, я думаю, e.target.files содержит более одной записи? Если да, e.target.files.forEach(function(file) { /* Do what you did before to upload each file */ }); 16.01.2017

Ответы:


1

Я нашел решение для своего вопроса, и мне нравится ставить его здесь, потому что он может быть полезен для всех.

//Listen for file selection
fileButton.addEventListener('change', function(e){ 
    //Get files
    for (var i = 0; i < e.target.files.length; i++) {
        var imageFile = e.target.files[i];

        uploadImageAsPromise(imageFile);
    }
});

//Handle waiting to upload each file using promise
function uploadImageAsPromise (imageFile) {
    return new Promise(function (resolve, reject) {
        var storageRef = firebase.storage().ref(fullDirectory+"/"+imageFile.name);

        //Upload file
        var task = storageRef.put(imageFile);

        //Update progress bar
        task.on('state_changed',
            function progress(snapshot){
                var percentage = snapshot.bytesTransferred / snapshot.totalBytes * 100;
                uploader.value = percentage;
            },
            function error(err){

            },
            function complete(){
                var downloadURL = task.snapshot.downloadURL;
            }
        );
    });
}
16.01.2017
  • если вы поставите несколько задач одновременной загрузки, как и вы, они будут загружены последовательно 13.02.2017
  • @isuru Можете ли вы поделиться своим исходным файлом в формате html? Вы просматриваете изображения? 11.03.2017
  • @ArunaRajput Я использовал вышеуказанный метод для загрузки нескольких изображений в хранилище Firebase. Собственно чего вы хотите добиться? 13.03.2017
  • @isuru Не могли бы вы рассказать, как выглядит переменная imageFile? 07.08.2017
  • Большое спасибо! Я потратил целый день, пытаясь разобраться во всем с объектами File, и ваш ответ мне очень помог. Единственное, что я могу придумать, чтобы добавить сюда, - это общий прогресс загрузки, который здесь не так просто реализовать. 18.01.2018
  • @ user1040495 Это неправда, они загружают параллельно 29.07.2018
  • @ user1040495 Да, так в чем проблема? 29.07.2019
  • облицовка (узел: 18140) UnhandledPromiseRejectionWarning: TypeError: Невозможно прочитать свойство byteLength из undefined, возникает эта ошибка из-за того, что загрузка файла началась до завершения файла, кто-нибудь знает, как с этим справиться? 22.07.2021

  • 2

    Firebase Storage использует Promise, поэтому вы можете использовать Promises для его достижения.

    Вот статья в блоге firebase, посвященная этой теме: Выполнение наших обещаний (и обратные вызовы)


    Дайте Promise.all () «массив обещаний»

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

    Загрузите каждый файл и верните обещание

    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 и YourFile можно переносить с массивом myItems (таким образом, объект item).

    Я опустил их здесь только для удобства чтения, но вы поняли концепцию.

    26.10.2017
  • Можете ли вы обновить это до текущей документации Firebase или хотя бы поделиться, как узнать ход выполнения текущей задачи, чтобы соответствующим образом обновить пользовательский интерфейс 26.01.2020

  • 3

    Я считаю, что есть более простое решение:

    // set it up
    firebase.storage().ref().constructor.prototype.putFiles = function(files) { 
      var ref = this;
      return Promise.all(files.map(function(file) {
        return ref.child(file.name).put(file);
      }));
    }
    
    // use it!
    firebase.storage().ref().putFiles(files).then(function(metadatas) {
      // Get an array of file metadata
    }).catch(function(error) {
      // If any task fails, handle this
    });
    
    02.10.2017
  • Еще не тестировал, но кажется изящным подходом. Есть ли способ отслеживать прогресс загрузки? вместо использования then/catch можем ли мы использовать on? 09.02.2020

  • 4

    Это модификация отмеченного ответа для тех, кто хочет дождаться завершения каждой загрузки до начала другой.

    Поскольку отмеченный ответ стоит, обещание не разрешено и не отклонено, поэтому, когда загрузка начинается с цикла, все просто запускается, 1-й файл, 2-й ...

    Подумайте о 3 загрузках каждые 20 МБ. Цикл будет вызывать функцию загрузки почти одновременно, заставляя их работать почти одновременно.

    Этот ответ решает эту проблему, используя async/await для обработки promises

    fileButton.addEventListener('change', async function(e){ 
        //Get files
        for (var i = 0; i < e.target.files.length; i++) {
            var imageFile = e.target.files[i];
            await uploadImageAsPromise(imageFile).then((res)=>{
             console.log(res);
              });
        }
    });
    
    //Handle waiting to upload each file using promise
    async function uploadImageAsPromise (imageFile) {
        return new Promise(function (resolve, reject) {
            var storageRef = firebase.storage().ref(fullDirectory+"/"+imageFile.name);
            var task = storageRef.put(imageFile);
    
            //Update progress bar
            task.on('state_changed',
                function progress(snapshot){
                    var percentage = snapshot.bytesTransferred / snapshot.totalBytes * 
                         100;
                },
                function error(err){
                    console.log(err);
                    reject(err);
                },
                function complete(){
                    var downloadURL = task.snapshot.downloadURL;
                    resolve(downloadURL);
                }
            );
        });
    }
    
    27.01.2020

    5

    @isuru, у парня, который загрузил вопрос, есть отличное решение, представленное ниже. Но некоторые функции firebase были обновлены. Итак, я только что обновил решение новыми обновлениями в Firebase.

      //Firebase Storage Reference
      const storageRef = firebase.storage().ref();
    
      //Upload Image Function returns a promise  
      async function uploadImageAsPromise(imageFile) {
        return new Promise(function (resolve, reject) {
          const task = storageRef.child(imageFile.name).put(imageFile);
    
          task.on(
            "state_changed",
            function progress(snapshot) {
              const percentage = (snapshot.bytesTransferred / snapshot.totalBytes) * 100;
            },
    
            function error(err) {
              reject(err);
            },
    
            async function complete() {
              //The getDownloadURL returns a promise and it is resolved to get the image url.
              const imageURL = await task.snapshot.ref.getDownloadURL();
              resolve(imageURL);
            }
          );
        });
      }
      
      //Handling the files
      fileButton.addEventListener('change', function(e){ 
        const promises = [];
        for(const file of e.target.files){//Instead of e.target.files, you could also have your files variable
            promises.push(uploadImageAsPromise(file))
        }
        
        //The Promise.all() will stop the execution, until all of the promises are resolved.
        Promise.all(promises).then((fileURLS)=>{
            //Once all the promises are resolved, you will get the urls in a array.
            console.log(fileURLS)
        })
      });
    
    20.11.2020

    6

    Мы можем комбинировать несколько обещаний, как это

    Promise.all([promise1, promise2, promise3]).then(function(values) {
      console.log(values);
    });
    

    И мы можем вот так цепочку обещаний

    return myFirstPromise.then( (returnFromFirst) => {
        //Do something
        return secondPromise();
    }).then( (returnFromSecond) => {
        //Do something
        return thirdPromise();
    }).then( (returnFromThird) => {
        //All Done
    }).catch( (e) =>{}
        console.error("SOMETHING WENT WRONG!!!");
    );
    

    Идея состоит в том, чтобы объединить обещания загружаемых файлов с Promise.all и связать их вместе, чтобы получать URL-адреса загрузки после каждой загрузки.

          Promise.all(
                //Array.map creates a new array with the results 
              // of calling a function for every array element. 
              //In this case Array of "Promises"
                this.state.filesToUpload.map(item => 
                 this.uploadFileAsPromise(item))
              )
                .then(url => {
                  console.log(`All success`);
    
                  //Handle Success all image upload
    
                })
                .catch(error => {
                  console.log(`Some failed: `, error.message);
    
                  //Handle Failure some/all image upload failed             
                });
    
    
      //return a promise which upload file & get download URL 
      uploadFileAsPromise(imageFile) {
            // the return value will be a Promise
            return storageRef
              .child("images/users/" + imageFile.name)
              .put(imageFile.file) 
              .then(snapshot => {
                console.log("Uploaded File:", imageFile.name);
                return snapshot.ref.getDownloadURL().then(downloadURL => {
                  //promise inside promise to get donloadable URL
                  console.log("File available at", downloadURL);
                  );
                });
              })
              .catch(error => {
                console.log("Upload failed:", imageFile.name, error.message);
              });
          }
    
    21.07.2019
  • Как отслеживать прогресс каждого, чтобы обновить пользовательский интерфейс 26.01.2020

  • 7

    все обещания довольно быстро становятся беспорядочными, почему бы не использовать вместо них async и await?

    Здесь у меня есть функция, которая отслеживает все изображения, выбранные из элемента управления вводом / файлом для загрузки:

    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]);
        }
    }
    

    И у меня есть еще одна функция, которая будет запускаться кнопкой, которую пользователь нажмет, когда будет готов выполнить фактическую загрузку:

    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);
            }
        })
    }
    

    Мы в основном просматриваем каждое изображение и выполняем загрузку, а затем помещаем пути к изображениям в отдельный массив imagePaths один за другим по мере того, как каждый из них завершается в своем собственном темпе, затем я захватываю все пути, как только мы узнаем, что все они выполнены, сравнивая длина изображений и их окончательные пути.

    01.11.2020

    8

    Это было легко реализовать с помощью rxjs switchMap иcommonLatest для Angular fire.

    21.12.2020

    9

    Загрузите файл и получите URL для загрузки

       export const handleFileUploadOnFirebaseStorage = async (bucketName, file) => {
          // 1. If no file, return
          if (file === "") return "";
    
          // 2. Put the file into bucketName
          const uploadTask = await storage.ref(`/${bucketName}/${file.name}`).put(file);
          
          // 3. Get download URL and return it as 
          return uploadTask.ref.getDownloadURL().then((fileURL) => fileURL);
       };
    

    Загрузить несколько файлов и получить URL для загрузки

    export const handleFilesUploadOnFirebaseStorage = async (bucketName, files) => {
        // 1. If no file, return
        if (files.length === 0) return [];
    
        // 2. Create an array to store all download URLs
        let fileUrls = [];
    
        // 3. Loop over all the files
        for (var i = 0; i < files.length; i++) {
            // 3A. Get a file to upload
            const file = files[i];
    
            // 3B. handleFileUploadOnFirebaseStorage function is in above section
            const downloadFileResponse = await handleFileUploadOnFirebaseStorage(bucketName, file);
            
            // 3C. Push the download url to URLs array
            fileUrls.push(downloadFileResponse);
        }
    
        return fileUrls;
    };
    
    13.05.2021
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..