【问题标题】:Uploading File doesn't let me pick same file after i remove it from selection从选择中删除后,上传文件不允许我选择相同的文件
【发布时间】:2020-03-11 10:25:13
【问题描述】:

我有这段代码,可以让我选择多个文件,然后将其上传到服务器。我使用 input type='file' 然后我添加到文件列表中选择的文件(例如我可以单击按钮,选择文件'A',然后再次单击相同的按钮并选择文件“B”,我的计数器是 2)。我还有一个按钮可以从选择中删除所有文件(如果您确实错误地选择了文件)。然后当我尝试重新选择相同的文件时,我的计数器仍然设置为 0。如果我选​​择不同的文件,则不会发生此问题,然后删除它并选择我想要的文件。 为了更简单,假设您有文件:

文件A.jpg、文件B.jpg、文件C.png

当我选择 FileA 时,计数器变为 1,然后我单击删除,计数器变为 0。

然后我想重新选择相同的 FileA,但它不计为已选择,只要我选择了与以前相同的文件,计数器仍设置为 0。

我的状态是这样的:

this.state={
          selectedFile:null,
          ile:0,
          lista:"",
       }

这是我的文件处理:

async handleRemove(){
    await this.setState({
      selectedFile:null,
      ile:0,
      lista:"",
      })
  data= new FormData();
  }

async handleSubmitFile(e) {
          await this.setState({selectedFile:e.target.files,})
          for(var x=0;x<this.state.selectedFile.length;x++){
                let rozszerzenie=this.state.selectedFile[x].name.split(".").pop();
                if(rozszerzenie.toUpperCase()==='PNG' || rozszerzenie.toUpperCase()==='JPEG' || rozszerzenie.toUpperCase()==='PDF' || rozszerzenie.toUpperCase()==='JPG')
                    {
                      data.append('images[]',this.state.selectedFile[x]);
                      if (this.state.lista.includes(this.state.selectedFile[x].name)){
                      }
                  else{await this.setState({
                      ile:this.state.ile+1,
                      lista:this.state.lista+this.state.selectedFile[x].name+"\n",
                  })
                  ;}
                }
                else{
                      alert("Błędny format pliku, proszę przesyłać tylko PNG, PDF oraz JPG/JPEG");
                      return;
                }  
              }
  }

我的回归变得简单

<input type='file' onChange={this.handleSubmitFile} multiple name='file' id='image' accept='application/pdf, image/*'/>
{this.state.ile}- number of files selected
{this.state.lista}-list of all files
<button type="button" className="fileupdate" onClick={this.handleRemove}>Remove files</button>

我觉得它以某种方式记住了上次选择,并且不允许重新选择它。有什么想法可以绕过它吗?

【问题讨论】:

    标签: javascript reactjs


    【解决方案1】:

    我的解决方案:从队列中删除一个元素后,您需要清除输入值。

    <input id="my-file" type="file" />
    
    document.getElementById('my-file').value = "";
    

    【讨论】:

      【解决方案2】:
      <input type='file' onChange={this.handleSubmitFile} multiple name='file' id='image' accept='application/pdf, image/*'/ value={this.state.selectedFile}>
      

      你需要给input加上value属性,所以当你清除selectedFile时,那么你的input也应该设置为null,因为onChange对变化起作用,所以如果文件没有变化它不会触发。

      【讨论】:

      • 添加 value={this.state.selectedFile} 只会在控制台中出现一堵红色错误墙,无法将 HTMLInputElement 设置为值。同样使用 this.state.ile/lista 也不起作用
      • 清除选中的文件时可以使用 ref 改变值
      • 你能帮我解决这个问题吗?尚未使用参考文献
      • 在状态之前添加了this.listRef=React.createRef();,将handleRemove 设置状态更改为selectedFile:this.listRef.current.value 并添加到我的输入中`ref={this.listRef} 但这并不能正常工作
      猜你喜欢
      • 2017-10-26
      • 2019-12-11
      • 2011-12-23
      • 1970-01-01
      • 2020-05-09
      • 1970-01-01
      • 2015-05-30
      • 1970-01-01
      • 2020-11-24
      相关资源
      最近更新 更多