multipart / form-data表单,没有字段名称

时间:2017-04-24 14:32:26

标签: javascript html node.js forms multer

我有一个HTML表单,我用它来向nodejs后端发送信息。然后我尝试使用相同的表单实现文件上传。为此,我不得不将表单的enctype从默认值(application / x-www-form-urlencoded)更改为enctype =' multipart / form-data',我不得不使用multer在后端。我也有这个按钮:

<input type="button" value="Submit" onclick="submitRequest(this);">

我必须改为:

<input type="submit" value="Submit" onclick="submitRequest(this);">

这在我现在有文件上传到服务器的意义上很有效。但是,此实现取决于表单中字段的名称。问题在于,我所拥有的大多数领域都没有名称。

我想知道是否有办法让文件和数据都能发送而不必为表单中的每个字段命名?我想知道是否可以将自己的数据注入到单击提交后生成的结果中,然后将结果发送到后端?如果没有,还有其他方法吗?

1 个答案:

答案 0 :(得分:0)

您可以使用FormData为服务器设置密钥和值multipart/form-datafetch()XMLHttpRequest()POST数据。

<form id="form">
  <select>
    <option value="1">1</option>
    <option value="2">2</option>
  </select>
  <input type="file" />
  <input type="submit" value="Submit" />
</form>

function submitRequest(event) {
  event.preventDefault();
  var i = 0;
  var inputs = form.querySelector("input[type=file], select");
  var fd = new FormData();
  for (let el of inputs) {
    if (el.tagName === "SELECT") {
      fd.append("select", el.value)
    }
    if (el.type === "file") {
      if (el.files.length) {
        for (let file of el.files) {
          fd.append("file" + (i++), file);
        }
      }
    }
  }
  fetch("/path/to/server", {method:"POST", body:fd})
  .then(function(response) {
    return response.text()
  })
  .then(function(res) {
    console.log(res)
  })
  .catch(function(err) {
    console.log(err)
  })
}

const form = document.getElementById("form");
form.onsubmit = submitRequest;