【问题标题】:Upload a file in a form in react以反应的形式上传文件
【发布时间】:2018-11-22 00:21:22
【问题描述】:

我想通过获取 api 来上传文件。但是,我的 formData() 返回空。

var formData = new FormData();
data.append("file", file[0]);

const options = {
    method: 'POST',
    headers: {...},
    body: formData
}

fetch("url", options)
    .then(resp => resp.json())
    .then(result => ... );

有我的表格:

<form onSubmit={this.handleSubmit()}>
    upload file
    <button type="submit"></button>
</form> 

【问题讨论】:

  • 我在答案中添加了示例图片,并回复了您的评论。

标签: javascript reactjs forms api file


【解决方案1】:

我认为您正在寻找的是:

formData.set('file', file[0])

【讨论】:

  • 是不是data.append("file", file[0]);
【解决方案2】:

data.append("文件", 文件[0]);应该是 formData.append("file", file[0]);

【讨论】:

【解决方案3】:

在formData里面可以看到的一种方式是这样的:

for (var pair of formData.entries()) {
  console.log(pair[0]+ ', '+ pair[1]);
}

你可以试试:

var formData = new FormData();

for (var key in files) {
  formData.append("file", file[0]);
}

这是我之前编写的两个函数,在我的 React.Component 类中:

var formData = new FormData();

handleFileUpload = files => {
  var chosenData = new FormData();
  var allFiles = [];
  for (var key in files) {
    if (!isNaN(key)) {
      chosenData.append("document", files[key].name);
    }
  }
  for (var pair of chosenData.entries()) {
    allFiles.push(pair[1]);
  }
  this.setState({ chosenFiles: allFiles });
  for (var obj in files) {
    if (!isNaN(obj)) {
      formData.append("document", files[obj]);
    }
  }
};

buttonClicked = e => {
  e.preventDefault();
  var newData = [];
  var newFormData = new FormData();
  if (
    this.state.chosenFiles.length !== formData.getAll("document").length
  ) {
    newData = formData
      .getAll("document")
      .slice(-this.state.chosenFiles.length);
    for (var obj = 0; obj < newData.length; obj++) {
      newFormData.append("document", newData[obj]);
    }
    this.fileUploader(newFormData);
  } else {
    this.fileUploader(formData);
  }
};

在我的渲染中:

<div id="selectFiles">
<label id="docFileLabel" htmlFor="docFile">
    Upload
  </label>
  <input
    type="file"
    id="docFile"
    className="docFile"
    onChange={e => {
      this.handleFileUpload(e.target.files, e);
    }}
    multiple
  />
</div>

示例图片:

另一个示例图片:

【讨论】:

  • 你为你的formData返回了什么?你把它放在你的body 中了吗?
  • 除非您使用 formData.entries() 执行我上面提到的操作,否则您无法看到 formData 内部。我基本上是将文件名添加到 formData,files[key].name。我将在我的答案中添加另一个示例函数和图像示例。
猜你喜欢
  • 1970-01-01
  • 2022-12-02
  • 1970-01-01
  • 1970-01-01
  • 2014-06-04
  • 2017-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多