表单数据仅附加最后的多项选择

Posted

技术标签:

【中文标题】表单数据仅附加最后的多项选择【英文标题】:Form-data only append last multiple selection 【发布时间】:2020-11-11 08:26:52 【问题描述】:

这可能是重复的,但我无法解决。 我可以通过 JQuery/Ajax 将多个图像发送到我的服务器(Asp.Net Core)并成功保存它们。但问题是当我想添加第二批文件时,第一批不会追加到表单数据。我使用按钮而不是通过输入 type="file" 字段添加图像。

html

<form asp-area="User" asp-controller="Item" asp-action="Create" id="createForm" method="post" enctype="multipart/form-data" >
    <input asp-for="ImageUrl" id="myInput" type="file" name="inputFile[]" accept="image/*" multiple style="display:none" />
    <button id="myButton" type="button">+ Add Files</button>

JS:

$(document).ready(function () 
  var inputFile = $('#myInput');
  $('#myButton').click(function () 
     $('#myInput').click();
  );                
  var files = [];
  $('#myInput').change(function () 
     var newFiles = [];
     for (var index = 0; index < inputFile[0].files.length; index++)                                         
       
          let file = inputFile[0].files[index];
          files.push(file);
           
     );
  );            

  $("#createForm").submit(function (e) 
      e.preventDefault();
      var formData = new FormData(document.getElementById('createForm'));
      //var formData = new FormData(this);
      files.forEach(file => 
          formData.append('file[]', file);
      );
      for (var pair of formData.entries()) 
          console.log(pair[0] + ', ' + pair[1]);
      

      $.ajax(
          type: "POST",
          cache: false,
          processData: false,
          contentType: false,
          url: $("#createForm").attr('action'),
          enctype: 'multipart/form-data',
          data: new FormData(this),
      );
  );  

);

假设我选择图片 1,2,3 并提交我的表单,所有 3 张图片都成功保存到服务器端。现在让我们尝试一个新记录:我添加图片 1、2、3,然后选择图片 4、5、6,因此我希望将 6 个图像附加到表单数据中。但只有最后一个选择 4,5,6 被保存到服务器!

这是我在下面的控制台报告。如您所见,我有input-File[]=3!像我没有 jquery 和 ajax,只使用纯 HTML/Input Multiple file 之类的东西,我只能上传我最后的选择!!

但是当我刷新页面并仅选择 1、2、3 张图像(仅选择一个)时,我有 input-File[]=3file[], [object File]=3 并且一切都很好。

我尝试了data: new FormData()data: formData 以及许多其他关于数据参数的选项,但没有人能解决我的问题:(

更新:******************************:

Case 1: 
 var formData = new FormData(document.getElementById('createForm'));
 .   .   .
 data: formData,

结果:服务器中没有图像保存,数据库中的 ImageUrl 为空。

 Case 2:
 var formData = new FormData()
 .   .   .  
 data: formData,

导致控制台出错:XML Parsing Error: no root element found

 Case 3:
 var formData = new FormData(this)
 .   .   .
 data: formData,

Results:假设我先选择图像 1、2、3,然后选择图像 4、5、6。我有图像 1,2,3,4,5,6 保存在服务器上,4,5,6 保存两次!!我快到了,但仍然无法管理它。

.

【问题讨论】:

【参考方案1】:

我认为您复制代码的方式可能存在错误。在$('#myInput').change(function () ... ); 之后有一个额外的); 我假设这不是问题的一部分,只是粘贴时的错误。

我认为的问题是您试图将文件与 inputFiles 分开发送。更新提交事件处理程序中的 for 循环应该可以满足您的需求。

$("#createForm").submit(function (e) 
    e.preventDefault();
    var formData = new FormData();
    files.forEach((file) => 
        formData.append('inputFile[]', file);
    );

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

    $.ajax(
        type: "POST",
        cache: false,
        processData: false,
        contentType: false,
        url: $("#createForm").attr('action'),
        enctype: 'multipart/form-data',
        data: formData,
    );
);

【讨论】:

我更改为formData.append('inputFile[]', file),没有任何变化,最后的选择仍然发送到服务器,但控制台日志发生了变化,现在我有两行:inputFile[], [object File] 6inputFile[], [object File] 3。但是仍然上传了 1,2,3 张图片。另一点更改为 data: formDatavar formData = new FormData(); 导致错误 XML Parsing Error: no root element found 。请阅读更新。 也许我误解了这个问题。如果您选择图像 1、2、3 并提交它们应该被上传。然后,如果您选择图像 4,5,6... 您是要再次上传 1,2,3 还是只想要 4,5,6?起初我的印象是你想要全部 6 个。但在你更新之后我不太确定。 “结果:假设我首先选择图像 1、2、3,然后选择图像 4、5、6。我有图像 1、2、3 和再次保存在服务器上的 1、2、3、4、5、6 !!我快到了,但仍然无法控制它。”看起来你不想要 1,2, 3。 我找到了更多关于您遇到的错误的信息。我在chrome中测试并没有收到错误。我认为它只是 Firefox - ovinitech.blogspot.com/2019/01/… 感谢您的回复。可能是我英语不好……无论如何,我需要将所有 6 张图片放在一起……但我希望用户能够从不同的文件夹中添加它们,这样用户可能不会一次选择它们,而是需要全部上传。但我最后选择了两次图像。更新已编辑。 我认为 4,5,6 两次是因为您在输入更改时将它们保存在 file[] 中。我在测试时遇到了同样的问题。这就是为什么我把它切换到var formData = new FormData()。您是否尝试在 Chrome 或 Edge 中查看是否仍然收到 XML Parsing Error

以上是关于表单数据仅附加最后的多项选择的主要内容,如果未能解决你的问题,请参考以下文章

多选字段仅提交最后选择的选项

跟踪一系列简单的多项选择网络表单答案

Python For循环仅将最后一个值附加到列表

如何分隔不同列中的多项选择短语(谷歌表单)?

一个 VPC 终端节点用于 AWS 中的多项服务

Python for 循环仅将最后一个列表作为值附加