如何在<q-uploader>中将图像编码为base64?

时间:2019-04-21 04:21:49

标签: javascript vue.js quasar-framework

我刚刚开始学习Quasar(和Vue)。我正在尝试将图片编码为Base64并保存到MongoDB。 下面提到的代码适用于该组件,但我无法针对该组件重做。 谢谢您

<q-uploader v-model="image" @change="encodeToBase64" />
<q-btn type="btn" @click="sendPhoto">Save photo in mongo and go next page</q-btn>
methods: {
    encodeToBase64 (event) {
      event.preventDefault()
      const file = event.target.files[0]
      const canvas = document.createElement('canvas')
      const ctx = canvas.getContext('2d')
      const reader = new FileReader()
      reader.onload = event => {
        const img = new Image()
        img.onload = () => {
          if (img.width > MAX_WIDTH) {
            canvas.width = MAX_WIDTH
            canvas.height = (MAX_WIDTH * img.height) / img.width
          } else {
            canvas.width = img.width
            canvas.height = img.height
          }
          ctx.drawImage(img, 0, 0, canvas.width, canvas.height)
          this.image = canvas.toDataURL('image/png').replace(/^data:image\/(png|jpg);base64,/, '')
          console.log('RESULT/png', this.image)
        }
        img.src = event.target.result
        console.log('RESULT!', img.src)
      }
      reader.readAsDataURL(file)
    }
}
sendPhoto (event) {
      event.preventDefault()
      this.$store.dispatch('image/create', {account_id: this.account_selected, image: this.image})
        .then((res) => {
          this.$router.push({'path': '/nextReadings/' + res._id})
        })
        .catch((err) => {
          err.message = 'Error message'
          this.errorHandler(err.message)
        })
    }

1 个答案:

答案 0 :(得分:0)

这里是如何将q-uploader中的文件转换为base64字符串。从那里应该可以弄清楚如何将此字符串插入数据库。

1)将引用名称添加到q-uploader。 (我正在使用“文件”)

<q-uploader ref="files" label="My Label" :additional-fields="[{name: 'name', value: 'value'}]" multiple/>

2)现在,您可以随时使用

在q-uploader中获取文件
this.$refs.files.files

3)创建以下两个功能。这是我发现的将JavaScript文件转换为base64的最简洁,最简单的方法。

async encodeToBase64(files) {
  var attach = [];
  var reader = [];

  // loop through each of the files in q-uploader
  for (let i = 0; i < files.length; i++) {
      attach[i] = await this.singleFileToBase64(i, files, reader)
  }
  // returns an array of all the files in base64 format
  return attach;
},

singleFileToBase64(i, files, reader) {
    reader[i] = new FileReader();   
    // read the file into a base64 format 
    reader[i].readAsDataURL(files[i]);

    return new Promise((resolve, reject) => {
        reader[i].onerror = () => {
            reader[i].abort();
            reject("Insert error message here")
        };

        // return the base 64 string
        reader[i].onload = function () {
            resolve(reader[i].result);
        };
    })
},

注意:在这里,使用异步,等待和承诺是关键。否则,在最终尝试使用输出之前,reader.onload可能尚未运行。

4)使用第2步中的代码调用函数

encodeToBase64(this.$refs.files.files)

注意:我写这篇文章是为了反映q-uploader中存在多个文件,因为要弄清异步,等待和承诺,可能很棘手。

注意:我可能会摆脱阅读器数组,而只是在singleFileToBase64方法中将其声明为普通阅读器...但我尚未对此进行测试。