使用Vuex和FIrebase存储多个图像。 (等待图像上传)

时间:2019-05-25 10:06:38

标签: javascript firebase firebase-storage vuex

我有一个有效的解决方案,用于将多个图像上传到Firebase。我从vue-croppa插件获得了图像,该插件在手机上效果很好。 我为所有图像生成BLOB文件。然后我将它们上传到Firebase存储,并接收一个URL,该URL放置在数据库的对象中。 (这是用于registring工具的项目。)

Vuex代码(JS):

createTool ({ commit }, payload) {
  let toolData = {
    croppas: payload.croppas,
    title: payload.title
  }
  var imageURLS = []
  // for Each image in images (croppas (plugin for vue btw) to get blob(s))
  toolData.croppas.forEach(file => {
      file.generateBlob(
          blob => {
            if (blob != null) {
            let rand = (Math.random().toString(36).substring(2, 16) + Math.random().toString(36).substring(2, 16)).toUpperCase()
            let imageRef = firebase.storage().ref('toolImages/').child(rand)
            imageRef.put(blob)
              .then( data => {
                imageRef.getDownloadURL()
                  .then( downloadURL => {
                  imageURLS.push(downloadURL)
                })
            })
          }     
          })
  })

  const mergedToolData = {
    title: payload.title,
    URLS: imageURLS
  }

  firebase.database().ref('tools').push(mergedToolData)
    .then((data) => {
      const key = data.key
      commit('createTool', {
        title: payload.title,
        URLS: imageURLS,
        id: key
      })
    })
},

图像被上传,并且我收到了存储在imageURLS []中的downloadURL。 挑战是,在将“工具”数据上传到数据库之前,代码不会等待for循环完成并检索所有URL。因此,URLS不会注册到该工具。 我认为解决方案将是一个异步等待系统,但是我真的不确定如何去做。

这是一个用于测试的.vue文件:

     <template>
      <v-layout column align-center>
        <v-flex xs12 sm6 class="mt-5">
          <croppa v-for="(c, i) in croppas"
            :key="i"
            v-model="croppas[i]"
            :width="300"
            :height="300"
            :placeholder="'Choose an image'"
            @new-image="croppas.push({})"
            v-show="i === croppas.length - 1 || c.imageSet">
          </croppa>
          <croppa
            :v-if="this.croppas == ''"
            :width="300"
            :height="300"
            :placeholder="'Choose an image'"
            @new-image="croppas.push({})">
          </croppa>
          </v-flex>
          <v-flex xs12 class="my-4">
            <v-btn @click="onCreateTool" color="#D08513" dark class="darkCustomBtn">Upload</v-btn>
            <v-btn to="/tools" flat class="customBtn ml-3" >Cancel</v-btn>
          </v-flex>
      </v-layout>
    </template>

    <script>
    export default {
      data () {
        return {
          title: '',
          croppas: []
        }
      },
      methods: {
        onCreateTool() {      
          this.$store.dispatch('createTool', { croppas: this.croppas, title: this.title })

        }
      }
    }
    </script>

1 个答案:

答案 0 :(得分:0)

答案已经存在:Answer。 正是您要寻找的:)。
这是很多方法中的一种,但是这确实存在于代码中,并且具有google错误处理程序。