Как загрузить несколько изображений в firebase с vue (+vuex)?

277
28 октября 2021, 01:20

Я учусь писать приложения на vuejs, решил сделать портфолио как тренировку, но застрял на одном моменте. Код ниже добавляет одно изображение, но мне нужно несколько, что бы потом использовать в слайдере. Подскажите, как это сделать? Вот мой template: `

<b-form-file
    size="sm"
    placeholder="Выберите файл..."
    @change="onFileChange" 
></b-form-file>
<div class="selected-images">
     <img :src="imageSrc" alt="">
</div>
data () {
    return {
      id:null,
      name:'',
      description:'',
      type:'',
      imageSrc:'',
      image:null
   }
},
method: {
    onFileChange (e) {
        const file = e.target.files[0]
        const reader = new FileReader()
        reader.onload = e => {
            this.imageSrc = reader.result
        } 
        reader.readAsDataURL(file)
        this.image = file
    }
}

Вот Vuex:

import * as fb from 'firebase'
class Work {
    constructor (name, description, type, id = null, imageSrc = '') {
        this.name = name,
        this.description = description,
        this.type = type,
        this.id = id
    }
}
...
actions: {
  async createWork ({commit}, payload) {
        commit('clearError')
        commit('setLoading', true)
        let imageSrc
        let key
        try {
            const newWork =  new Work (
                payload.name,
                payload.description,
                payload.type,
                ''
            )
            await fb.database().ref('works').push(newWork)
            .then((data) => {
                key = data.key
                return key
            })
            .then(key => {
                const filename = payload.image.name
                const ext = filename.slice(filename.lastIndexOf('.'))
                return fb.storage().ref('works/' + key + '.' + ext).put(payload.image)
            })
            .then(snapshot => {
                return new Promise((resolve) => {
                    snapshot.ref.getDownloadURL().then(url => {
                        snapshot.downloadURL = url
                        resolve(snapshot)
                    })
                })
            })
            .then((snapshot) => {
                imageSrc = snapshot.downloadURL
                return fb.database().ref('works').child(key).update({imageSrc: imageSrc})
            })
            .then(() => {
                commit('setLoading', false)
                commit('createWork', {
                    ...newWork,
                    imageSrc: imageSrc,
                    id: key
                })
            })
        } catch (error) {
            commit('setError', error.message)
            commit('setLoading', false)
            throw error
        }
    }
}

Заранее спасибо всем, кто поможет разобраться!

Answer 1
// ЗАГРУЗКА ФОТО
                    const promises = []
                    const promisesName = []
    
                    if (File) {
                        for (let i = 0; i < File.length; i++) {
    
                            const storageRef = firebase.storage().ref();
                        // Загрузить файл и метаданные в объект //'assets/images/***.jpg'
                        // Создайте метаданные файла
                            let metadata = {
                                contentType: 'image/jpeg',
                            };
                            const nameTime = +new Date() + '.jpg'
                        // Загружаем файлы на firebase storage
                            const uploadTask = storageRef.child('assets/images/' + nameTime).put(File[i], metadata);
    ```
//Получаем URL по которому сможем достать файл в firebase cloud из firebase //storage. Создаем массив из всех URL. Добавляя их в массив promises
                        promises.push(
                            uploadTask
                                .then(snapshot =>
                                    snapshot.ref.getDownloadURL()
                                )
                        )
//Короткое имя файла. Также добавляем в массив с помощью промисов
                        promisesName.push(
                            nameTime
                        )
                    }
                }
                const URLs = await Promise.all(promises)
                const NameImages = await Promise.all(promisesName)
    //Добавляем в cloude firebase
                await db.collection('products').add({
                    NameImages: NameImages,                        
                    arrayImages: URLs,                        
                })                      
               
            },
READ ALSO
Вывод двух знаков в дробной части числа

Вывод двух знаков в дробной части числа

Kак правильно написать выражение - "только положительные числа и 2 знака после, если не ввели после запятой сотые, то записалось как00"

95
Событие на закрытие вкладки

Событие на закрытие вкладки

Подскажите ,как реализовать защиту от случайного закрытия вкладки ? Я вкурсе про windowonunload и window

87
if и ternary в return

if и ternary в return

Почему в return нельзя вставить if

152
Проверка типа данных ячейки в таблице HTML с помощью javascript [дубликат]

Проверка типа данных ячейки в таблице HTML с помощью javascript [дубликат]

Как проверить, что в ячейке лежит число или нет с помощью javascript?

99