I'm trying to get the input of a .csv File, after I choose it with my Html 5 input field. Therefor I use a onFileChange method and a FileReader(). Here is an example I used: http://codepen.io/Atinux/pen/qOvawK/ (except that I want to read the text input, and not an image file).
My Problem is, that I get an empty input on the first try, but on the second try it works. Why is that? Any ideas? (I'm a javascript beginner ;) )
html:
<form enctype="multipart/form-data">
<input type="file" @change="onFileChange">
</form>
js:
new Vue({
el: '#app',
data: {
fileinput: ''
},
methods: {
onFileChange(e) {
var files = e.target.files || e.dataTransfer.files;
if (!files.length)
return;
this.createInput(files[0]);
},
createInput(file) {
var reader = new FileReader();
var vm = this;
reader.onload = (e) => {
vm.fileinput = reader.result;
}
reader.readAsText(file);
console.log(this.fileinput);
}
}
})
The reason why the console.log
is not displaying anything is because FileReader.readAsText()
is asynchronous. It completes after the console.log
has executed.
You can typically deal with this by putting a watch on fileInput
or throwing a local event using vm.$emit
from the onload
handler.
Here's another way
onFileChange: function(e) {
const file = e.target.files[0];
const reader = new FileReader();
reader.onload = e => console.log(e.target.result);
reader.readAsText(file);
},
Reference Creating a Vue.js File Reader Component Using the FileReader API
Here you can handle async code using Promise
function
new Vue({
el: "#app",
data: {
fileinput: ""
},
methods: {
onFileChange(e) {
var files = e.target.files || e.dataTransfer.files;
if (!files.length) return;
this.createInput(files[0]);
},
createInput(file) {
let promise = new Promise((resolve, reject) => {
var reader = new FileReader();
var vm = this;
reader.onload = e => {
resolve((vm.fileinput = reader.result));
};
reader.readAsText(file);
});
promise.then(
result => {
/* handle a successful result */
console.log(this.fileinput);
},
error => {
/* handle an error */
console.log(error);
}
);
}
}
});
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With