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

AngularJS多文件上传进度条:错误时分段变色实现咨询

我来帮你搞定这个问题!要实现进度条分段对应文件处理的成功/失败状态,我们需要从状态跟踪逻辑和进度条渲染方式两方面调整代码,因为原生单个uib-progressbar只能设置一种颜色,所以改用多分段的进度条来匹配每个文件的处理结果。

解决方案

1. 调整控制器的状态跟踪逻辑

首先我们需要记录每个文件的处理状态(成功/失败/待处理),而不是只跟踪总进度数值。

初始化文件状态数组

在开始文件夹上传时,根据总文件数初始化一个状态数组,用来记录每个文件的处理状态:

// 假设在上传流程启动时执行这段初始化代码
$rootScope.totalFiles = /* 你的总文件数量 */;
$rootScope.currentFileIndex = 0; // 当前正在处理的文件索引
$rootScope.fileProcessingStatuses = Array($rootScope.totalFiles).fill({
  status: 'pending', // 状态可选值:pending/success/error
  completed: false
});
$rootScope.progressValue = 0;
$rootScope.progressValuePercentage = 0;
$rootScope.folderProcessing = true;

更新文件处理状态

在文件处理结果判断的逻辑中,同步更新对应索引文件的状态:

if (docType === AppConstants.docType.RESUME) {
  const currentIndex = $rootScope.currentFileIndex;
  if(res.isProcessedSuccessfully) {
    $rootScope.fileProcessingStatuses[currentIndex].status = 'success';
    toastr.success(AppConstants.fileProcessSuccessMessage, 'File processed successfully');
  } else {
    $rootScope.fileProcessingStatuses[currentIndex].status = 'error';
    toastr.error(res.documentId, 'File Processing Failed');
  }
  // 标记该文件处理完成
  $rootScope.fileProcessingStatuses[currentIndex].completed = true;
  
  // 更新总进度和百分比
  $rootScope.progressValue += 1;
  $rootScope.progressValuePercentage = (($rootScope.progressValue * 100) / $rootScope.totalFiles).toFixed(2);
  
  // 切换到下一个文件的索引
  $rootScope.currentFileIndex += 1;
  
  // 所有文件处理完成后重置状态
  if ($rootScope.progressValue === $rootScope.totalFiles) {
    $rootScope.progressValue = 0;
    $rootScope.progressValuePercentage = 0;
    $rootScope.currentFileIndex = 0;
    // 可选:保留状态数组以便查看历史,或清空重置
    // $rootScope.fileProcessingStatuses = [];
  }
} else {
  // 非RESUME类型文件处理完成,若为批量处理请调整此处逻辑,确保所有文件处理完再关闭进度条
  $rootScope.folderProcessing = false;
  toastr.success(AppConstants.jobDescriptionSuccessMessage, 'File processed successfully');
  $scope.hideProcessSpinner = true;
}

2. 修改HTML的进度条渲染

改用uib-progress容器搭配多个uib-bar实现分段进度条,每个分段对应一个文件的处理状态:

<uib-progress class="progress-striped active" ng-show="folderProcessing && !isSingleFile" animate="true">
  <!-- 循环每个文件状态,生成对应进度分段 -->
  <uib-bar 
    ng-repeat="status in fileProcessingStatuses track by $index" 
    value="{{100 / totalFiles}}" 
    type="{{status.status === 'success' ? 'success' : status.status === 'error' ? 'danger' : 'info'}}">
  </uib-bar>
  <!-- 居中显示总进度百分比 -->
  <div class="progress-label" style="position:absolute; width:100%; text-align:center; line-height:20px;">
    <i><span> {{progressValuePercentage}} / 100 </span></i>
  </div>
</uib-progress>

代码说明

  • uib-progress作为进度条容器,uib-bar是每个独立的进度分段。
  • 每个uib-bar的value设置为100 / totalFiles,确保每个文件对应等宽的进度分段。
  • type属性动态切换:成功用success(绿色)、失败用danger(红色)、待处理用info(蓝色)。
  • 进度百分比标签通过绝对定位居中,避免被分段遮挡。

3. 收尾逻辑调整

如果非RESUME类型文件是批量处理的,建议调整folderProcessing的设置时机,确保所有文件处理完成后再关闭进度条,避免中途隐藏进度条。

这样调整后,每个文件处理失败时对应的进度分段会变成红色,成功的分段保持绿色,完全符合你的需求!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:07:55