下载过程中服务器断开,如何取到已下载的数据?

2021-11-26 16:00:16 +08:00
 waiaan

在 onprogress 中取 xhr.response ,结果值为 null 。 如题,谢谢。

1176 次点击
所在节点    前端开发
13 条回复
wunonglin
2021-11-26 16:02:23 +08:00
waiaan
2021-11-26 16:07:10 +08:00
@wunonglin

或者为 NULL(如果请求未完成或失败)

我这里其实算是请求未完成状态
wunonglin
2021-11-26 16:13:22 +08:00
请求成功后可以获取 body 的数据,在获取 body 的过程中(也就是下载),是可以得到以获取的二进制呀。
大白话将你是想获取啥?按我理解,你是不是想下载了一半断网或者出错了,提取已经下载到的数据是不?
waiaan
2021-11-26 16:27:33 +08:00
@wunonglin
对的,是下载大文件的场景,连接已经建立成功,传输数据过程中断网,想取到已传输的数据
wunonglin
2021-11-26 16:28:25 +08:00
@waiaan #4 那就是通过我#1 的方法去获取呗
waiaan
2021-11-26 16:35:02 +08:00
@wunonglin

不行,取出来是 null 。
waiaan
2021-11-26 16:36:00 +08:00
@wunonglin
文档里说

response 属性的值会根据 responseType 属性包含实体主体( entity body ), 它可能会是一个 ArrayBuffer, Blob, Document,JSON, string,或者为 NULL(如果请求未完成或失败)

我这个算请求未完成吗?
wunonglin
2021-11-26 16:39:27 +08:00
@waiaan #6

其实你可以分片下载就好了,比如 100m 文件分 10m 一个请求,当你下载到了 60m (也就是执行成功了 6/10 请求)到了第 7 个失败了,依然可以重试第 7 个。

一般情况下没人会在不稳定场景下下载大文件的(这里是我不知道你需求下的建议)
wunonglin
2021-11-26 16:42:15 +08:00
@waiaan #6 你可以看看视频网站的请求,比如 A 站、B 站、P 站,都是分片请求的,对于他们来说可以实现拖拽播放,动态清晰度切换,音视频轨道分离等操作
waiaan
2021-11-26 16:55:59 +08:00
@wunonglin

网络环境比较特殊,可以看成不确定 10m 能否在网络断开前下载完,只能取多少算多少,最后再来拼接。
wunonglin
2021-11-26 17:08:00 +08:00
@waiaan #10

文件小的话重试就可以了。大文件就要分片下载了。
10m 都不确定能不能下的话要么就分小片(比如 1m 一片? 512k 一片?这都不行你就要解决一下网络的问题了),要么就整个重试咯。毕竟文档也说请求没完成他会返回 null ,这个在浏览器内是没办法了
wunonglin
2021-11-26 17:10:48 +08:00
@waiaan #10

分片太多会造成请求过多,但是你网络比较特殊的话你就自己考量考量咯。。

当然你也可以动态分片大小,10m 一片出错了就降低成 1m ,以此类推呗
waiaan
2021-11-26 17:11:13 +08:00
@wunonglin 多谢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/818175

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX