我刚刚开始学习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)
})
}
答案 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
方法中将其声明为普通阅读器...但我尚未对此进行测试。