You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AngularJS中如何从$scope.WaiveFormData移除已追加的文件项

解决AngularJS中移除FormData对应上传文件的问题

这个问题的核心在于FormData对象本身的局限性——它没有提供直接删除指定键值对的方法,而且你之前依赖input的files集合来追加文件,但input的files是只读的,没法直接修改。解决思路是维护一个独立的文件数组来跟踪已选文件,再基于这个数组同步更新FormData,这样删除操作就变得简单了。

具体实现步骤

1. 初始化跟踪已选文件的数组

首先在控制器里添加一个数组,用来存储所有已选择的文件,后续的新增、删除操作都基于这个数组:

$scope.selectedFiles = [];
// 初始化FormData(如果之前没初始化的话)
$scope.WaiveFormData = new FormData();

2. 修改文件选择的处理函数

不再直接操作FormData,而是把选中的文件添加到selectedFiles数组,然后同步更新FormData:

$scope.getTheFiles = function($files) {
  // 将新增的文件批量添加到跟踪数组
  Array.prototype.push.apply($scope.selectedFiles, $files);
  // 同步更新FormData
  $scope.updateWaiveFormData();
};

3. 实现FormData同步函数

这个函数负责根据selectedFiles数组重新构建FormData,确保两者完全同步:

$scope.updateWaiveFormData = function() {
  // 先备份FormData中的非文件字段(如果有的话)
  const otherFields = {};
  for (const pair of $scope.WaiveFormData.entries()) {
    // 假设文件字段都是以"Attachement"开头,跳过这些字段
    if (!pair[0].startsWith('Attachement')) {
      otherFields[pair[0]] = pair[1];
    }
  }

  // 清空原FormData并重新构建
  $scope.WaiveFormData = new FormData();

  // 先把非文件字段加回去
  Object.keys(otherFields).forEach(key => {
    $scope.WaiveFormData.append(key, otherFields[key]);
  });

  // 遍历跟踪数组,添加文件到FormData
  $scope.selectedFiles.forEach((file, index) => {
    $scope.WaiveFormData.append(`Attachement${index}`, file);
  });
};

4. 实现删除文件的函数

当用户删除已选文件时,从selectedFiles数组中移除对应项,再调用同步函数更新FormData:

$scope.removeFile = function(fileIndex) {
  // 从跟踪数组中移除指定索引的文件
  $scope.selectedFiles.splice(fileIndex, 1);
  // 同步更新FormData
  $scope.updateWaiveFormData();
};

5. 在HTML中添加文件列表和删除按钮

把已选文件列表渲染出来,并给每个文件绑定删除事件:

<!-- 已选文件列表 -->
<div class="selected-files" ng-repeat="file in selectedFiles track by $index">
  <span>{{file.name}} ({{(file.size / 1024 / 1024).toFixed(2)}}MB)</span>
  <button ng-click="removeFile($index)" class="delete-btn">删除</button>
</div>

<!-- 原文件上传控件 -->
<input type="file" class="md-input dropify" id="inputs" multiple required ng-model="gFiles" ngf-multiple="true" ng-files="getTheFiles($files)"/>

为什么这个方案可行?

  • selectedFiles数组是可修改的,我们可以通过splice轻松移除指定文件
  • 每次修改数组后重新构建FormData,确保WaiveFormData和已选文件完全同步
  • 备份并还原非文件字段,避免丢失其他表单数据

内容的提问来源于stack exchange,提问作者User

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:15:49