Angular 中利用 rxjs 操作文件上传及进度监听

阅读时长 7 分钟读完

在前端开发中,文件上传是一个常见的需求。而为了提升用户体验,我们通常需要实现上传进度的监听。Angular 中利用 rxjs 进行文件上传及进度监听,不仅能够更好地实现这一需求,还能提升代码的复用性和可读性。

依赖

在使用 rxjs 进行文件上传和进度监听时,我们需要引用以下依赖:

其中,HttpClient 用于进行 http 请求,HttpErrorResponse 用于捕获错误,HttpEventTypeHttpEvent 则用于实现进度监听。ObservableBehaviorSubject 则是 rxjs 中非常重要的两个类,用于实现响应式编程。

实现文件上传

下面是一个文件上传的示例代码:

-- -------------------- ---- -------
---------------- ------ ------------------ -
  ----- --- - -------------------------
  ----- --------- -------- - --- -----------
  ----------------------- ----- -----------

  ----- -------- - --- ---------------------------
  ----- --- - --- ------------------- ---- --------- -
    --------------- ----
  ---

  ---------------------------------------- --------------- -- -
    -- ----------- --- ----------------------------- -
      ----- ----------- - -------------- - ------------ - -------------
      ---------------------------
    - ---- -- ----------- --- ----------------------- -
      --------------------
    -
  ---

  ------ ------------------------
-

以上代码中,我们首先创建了一个 FormData 对象,用于存储要上传的文件。紧接着,我们创建了一个 BehaviorSubject 对象 progress,用于存储上传进度。请求参数 reportProgress 设置为 true,表示开启进度监听。

在 http 请求中,我们使用 HttpRequest 对象代替了 request 方法,且传入了 reportProgress 选项。当上传过程中,数据上传的进度变化时,http.request 会不断触发 HttpEventType.UploadProgress 事件,我们可以获取到已上传的数据长度和总长度,从而计算出上传进度,并将其存入 progress 中。当文件上传完毕时,http.request 会触发 HttpEventType.Response 事件,此时我们可以通过调用 progress.complete() 来结束上传进度的监听。

最后,我们将 progress 对象转换为 Observable 对象返回,作为文件上传的结果。在组件中,我们只需要调用 uploadFile 方法即可:

实现多文件上传

以上示例只能上传单个文件,如果需要上传多个文件,我们需要对代码进行一定的修改。

-- -------------------- ---- -------
------------------ ------------- ------------------------- -
  ----- --- - -------------------------
  ----- --------- -------- - --- -----------

  -------------------- -- -
    ------------------------ ----- -----------
  ---

  ----- ------------ - --- ---------------------------------
  ----- --- - --- ------------------- ---- --------- -
    --------------- ----
  ---

  ---------------------------------------- --------------- -- -
    -- ----------- --- ----------------------------- -
      ----- ----------- - -------------- - ------------ - -------------
      ------------------------- - ------------------------------------------- - ------------------------- - --- ------------------------------------
    - ---- -- ----------- --- ----------------------- -
      ----------------------------- -- ---------------------
    -
  ---

  ------ --- ------------------------------------ -- -
    ----------------------------------------- -- ----------------------
    ----------------------
  ---
-

以上代码中,我们使用 formData.append 方法逐一将文件添加至 FormData 对象中,然后创建一个 Array 用于存储多个文件的上传进度,每个文件对应一个 BehaviorSubject,然后采用 HttpRequest 对象进行请求。当上传进度产生变化时,我们不但需要计算出上传进度,还需要记录下当前文件的上传进度,并将其存入对应的 BehaviorSubject 中。在请求完成时,我们通过调用 progressList.forEach(progress => progress.complete()) 来结束监听。

最后,我们需要将上传进度的列表以 Observable 对象的形式返回给调用者,使用时,只需要先选择多个文件,再调用 uploadFiles 方法即可:

总结

本文介绍了在 Angular 中利用 rxjs 操作文件上传及进度监听的方法,介绍了相关依赖,并给出了详细的示例代码,希望能对读者的开发工作有所帮助。通过利用 rxjs,我们可以更方便地实现文件上传及进度监听,提升了代码的复用性和可读性。同时,本文也提供了多文件上传的实现方式,读者可以根据自己的需求,进行相应的修改。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64a115f748841e9894d5b360

纠错
反馈