VueJS csv文件读取器

VueJS csv Filereader

本文关键字:读取 文件 csv VueJS      更新时间:2023-09-26

在用Html 5输入字段选择.csv文件后,我正在尝试获取该文件的输入。因此,我使用了一个onFileChange方法和一个FileReader()。下面是我使用的一个示例:http://codepen.io/Atinux/pen/qOvawK/(除了我想读取文本输入,而不是图像文件)。

我的问题是,我在第一次尝试时得到了一个空输入,但在第二次尝试时它有效。为什么?有什么想法吗?(我是javascript初学者;))

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);
        }
    }
})

console.log不显示任何内容的原因是因为FileReader.readAsText()是异步的。它在执行了console.log之后完成

通常可以通过在fileInput上放置一个监视或使用onload处理程序中的vm.$emit引发本地事件来处理此问题。

这里可以使用Promise函数处理异步代码

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);
        }
      );
    }
  }
});

这是的另一种方式

        onFileChange: function(e) {
            const file = e.target.files[0];
            const reader = new FileReader();
            reader.onload = e => console.log(e.target.result);
            reader.readAsText(file);
        },

参考使用FileReader API 创建Vue.js文件阅读器组件

如果您希望在promise和数据中定义单独的函数,也可以尝试如下。

    new Vue({
    el: "#app",
    data: {
        fileinput: ""
    },
    methods: {
        readFile: function(evt) {
            const scope = this
            var promiseVar = new Promise(async (resolve, reject) => {
                try {
                    var reader = new FileReader();
                    var file = evt.target.files[0];
                    reader.readAsText(file);
                    reader.onload = function(e) {
                        scope.fileinput = e.target.result
                        resolve('complete');
                    };
                } catch (error) {
                    console.error(error);
                    reject("There must be an error");
                }
            });
            // let updateds = await Promise.all(promiseVar);
            promiseVar.then(data=>{
                scope.afterRead();
            })
        },
        afterRead:function(){
            console.log(this.fileinput)
            // write your logic for import here
        }
    }
});