使用axios下载blob文件,文件过大时超时

思否 问答 👍 2 含 AI 优化版

问题

使用axios下载blob文件,文件过大时超时

在 SegmentFault 查看原问题 →

由大模型辅助整理,保留原意,优化结构与可读性。

问题概述

提问者使用 axios 下载 blob 类型的大文件时遇到了超时问题,希望了解超时的可能原因,同时也关心如何在下载过程中展示进度。

涉及技术

JavaScript、axios、Blob、HTTP

期望结果

希望定位大文件下载超时的根本原因并解决,同时获得展示上传/下载进度的实现方式。

回答

原始回答

2020-05-23

超时问题有两种

前端设置了 timeout,不设置即可

服务端断开了链接,服务端把时间改长点

进度的问题,前端发请求是有两个进度的,都可以监听用于显示

上传进度 前端培训-中级阶段(21)- xhr2、FormData(2019-10-17期) demo - http://www.lilnong.top/static/html/bug-test-img-upload-cut.html

下载进度 前端培训-初级阶段-场景实战(2019-06-06)-下载文件&下载进度

axios 中的进度回调

// onUploadProgress 允许为上传处理进度事件

onUploadProgress: function (progressEvent) {

// 对原生进度事件的处理

},

// onDownloadProgress 允许为下载处理进度事件

onDownloadProgress: function (progressEvent) {

// 对原生进度事件的处理

},

AI 优化 · 回答整理

解答思路

超时问题通常来自两个方向:前端自己设置了过短的 timeout 限制,或服务端主动断开了长时间未完成的连接。针对下载进度展示,axios 本身提供了 onUploadProgressonDownloadProgress 两个回调,可以直接监听原生的进度事件。

示例代码

axios.get(url, {
  responseType: 'blob',
  // onUploadProgress 允许为上传处理进度事件
  onUploadProgress: function (progressEvent) {
    // 对原生进度事件的处理
  },
  // onDownloadProgress 允许为下载处理进度事件
  onDownloadProgress: function (progressEvent) {
    // 对原生进度事件的处理
  },
});

详细说明

超时问题的两种常见成因及对应处理方式:

  1. 前端设置了 timeout:axios 请求配置中如果显式设置了 timeout(毫秒),一旦请求耗时超过该值就会被主动中断并抛出超时错误。对于大文件下载场景,可以直接不设置 timeout(或设置一个足够大的值),避免因下载耗时较长而被误判为超时。
  2. 服务端主动断开连接:如果服务端本身设置了较短的连接保持时间,长时间未完成的请求会被服务端断开,这种情况需要调整服务端的超时/连接保持时长配置,前端无法单方面解决。

关于进度展示,axios 提供了两个进度相关的回调配置:

  • onUploadProgress:用于监听上传过程的原生进度事件,适合文件上传场景。
  • onDownloadProgress:用于监听下载过程的原生进度事件,适合文件下载场景(如本问题中的 blob 下载)。

两者的回调参数都是原生的 ProgressEvent,可以从中读取 loadedtotal 等字段来计算并展示具体的百分比进度。

小结

大文件下载超时,优先检查前端 timeout 配置是否过短,其次考虑服务端连接保持时间;下载/上传进度展示则可以直接使用 axios 内置的 onDownloadProgress/onUploadProgress 回调。

由大模型辅助整理,保留原意,补充结构与代码格式。

回答转载自 SegmentFault

评论

评论功能即将开放。你也可以通过 邮件GitHub Issue 反馈。