代码之家  ›  专栏  ›  技术社区  ›  ps0604

FileReader事件侦听器不能调用多次

  •  0
  • ps0604  · 技术社区  · 4 年前

    我有下面的Typescript函数,当调用它时会打开一个窗口来请求一个文件,在用户做出选择之后,它会在控制台中打印文件内容。

    第一次可以,但问题是,如果我打两次电话,就没用了。第二次打开窗口时,如果选择了文件,则不会执行任何操作。这个函数有什么问题?

    <input id="file-input" type="file" name="name" style="display: none;" />
    
    
    printFile(){
    
        var input = document.getElementById('file-input');
    
        input.addEventListener('input', () => {
    
            var uploadedFile = (input as HTMLInputElement).files[0];
    
            var reader = new FileReader();
    
            reader.addEventListener('load', () => {
                console.log(reader.result);
            });
              
            reader.readAsText(uploadedFile);
    
        });
              
        input.click();
    
    }
    
    2 回复  |  直到 4 年前
        1
  •  2
  •   Lucas Simões    4 年前

    您正在向FileReader添加一个侦听器,然后再次实例化它。正确的工作方式应该是 (类似的样本,但使用图像)

    HTML格式

    <input
      #fileInput
      type="file"
      accept="image/png, image/jpeg"
      (change)="handleChosenFile($event)"
    />
    

    打字稿

    handleChosenFile(event: Event) {
      const target = event.target as HTMLInputElement;
      if (target.files && target.files.length) {
        this.selectedFile = target.files.item(0);
        const reader = new FileReader();
        reader.readAsDataURL(this.selectedFile);
        reader.onload = () => {
          // Your function
        };
      } else {
        // Your alert to "no file selected"
      }
    }
    
        2
  •  1
  •   JB_DELR    4 年前
     reader.addEventListener('load', () => {
                console.log(reader.result);
            });
    

     reader.addEventListener('load', (event) => {
                console.log(event.target.result);
            });