收集多个输入文件以附加到 FormData

collect multiple inputs file to append to FormData

假设我有以下表格。

<form id="testForm">
  <input type="file" name="uploads[]"><br/>
  <input type="file" name="uploads[]"><br/>
  <input type="file" name="uploads[]"><br/>
  <input type="submit">
</form>

这是尝试收集文件以附加到 FormData 的提交代码的一部分,但我不知道如何正确地完成它。

var formData = new FormData();

var fileList = $("input[name='uploads[]']");
for(var x = 0; x < fileList.length; x++) {
  formData.append('file'+x, ???);
  console.log('appended a file');
}

var request = new XMLHttpRequest();
request.open('POST', '/upload');
request.send(formData);

request.onload = function(e) {
  console.log('Request Status', request.status);
};

这是服务器代码。

app.post('/upload', function(req, res) {
  var form = new formidable.IncomingForm();
  form.parse(req, function(err, fields, files) {
    console.log('handling form upload - fields', fields);
    console.log('handling form upload - files', files);
  });
  res.send('Thank you');
});

如果成功,我希望看到输出和文件保存在 /tmp 中。

您不必收集字段,因为您可以将表单本身放入 FormData 对象中:

var form = document.getElementById('testForm');

form.addEventListener('submit', function(e) {

  e.preventDefault();

  var request = new XMLHttpRequest();
  request.open('POST', '/upload');

  request.onload = function(e) {
    console.log('Request Status', request.status);
  };

  var formData = new FormData(form);
  request.send(formData);
});

更新

如果您需要上传多个文件,您可以在输入上使用 multiple 属性而不是多个输入:

<form id="testForm">
  <input type="file" name="upload" multiple>
  <input type="submit">
</form>