96SEO 2026-02-20 07:55 0
在文件的下载中特别是大文件的下载中可能会出现各种原因导致的下载暂停情况如果不做特殊处理下次还需要从头开始下载既浪费了时间又浪费了流量。

不过HTTP协议通过Range首部提供了对文件分块下载的支持也就是说可以指定服务器返回文件特定范围的数据这就为我们实现文件的断点续传提供了基础。
RCP也很好的封装了这一点通过Request对象的transferRange属性可以支持分块下载transferRange可以是TransferRange或者TransferRange数组TransferRange类型包括两个属性from和to
from用于设置传输数据的起始字节,to用于设置传输数据的结束字节。
有了RCP的支持就比较容易实现文件的断点续传本文将通过一个示例进行演示。
首选输入要下载文件的URL这里默认是下载的百度网盘的安装文件大概98M左右然后单击“选择”按钮选择本地保存路径如下图所示
选择保存的文件名称为demo.rpm然后回到主界面单击“下载”按钮就行下载
这样就实现了任意时候中断下载或者退出应用都不影响已下载的部分下次可以继续下载实现了真正的断点续传。
//每次下载的字节数downloadPerBatchSize:
https://4d677c-1863975141.antpcdn.com:19001/b/pkg-ant.baidu.com/issue/netdisk/LinuxGuanjia/4.17.7/baidunetdisk_4.17.7_x86_64.rpm//是否正在下载Local
//断点续传下载文件信息使用PersistenceV2进行持久化存储Local
PersistenceV2.connect(DownloadFileInfo,()
DownloadFileInfo(this.defaultUrl,
rcp.createSession();//当前请求currentReq:
{Text(this.title).fontSize(14).fontWeight(FontWeight.Bold).width(100%).textAlign(TextAlign.Center).padding(5)
{Text(url地址).fontSize(14).width(80).flexGrow(0)
value}).width(110).fontSize(11).flexGrow(1)}.width(100%).padding(5)
{Text(本地保存路径).fontSize(14).width(80).flexGrow(1)
{this.downloadFileInfo.filePath
getSaveFilePath(getContext(this))if
(fs.accessSync(this.downloadFileInfo.filePath))
{fs.unlinkSync(this.downloadFileInfo.filePath)}}).width(110).fontSize(14)
falsethis.currentSession.cancel(this.currentReq)}
}).enabled(this.downloadFileInfo.filePath
2).width(110).fontSize(14)}.width(100%).padding(5)
Text(this.downloadFileInfo.filePath).fontSize(14).width(100%).padding(5)
{Text(${(this.downloadFileInfo.totalSize
:((this.downloadFileInfo.downloadedSize
this.downloadFileInfo.totalSize)
100).toFixed(2))}%)}.width(200)
this.downloadFileInfo.downloadedSize,total:
this.downloadFileInfo.totalSize,type:
ProgressType.Capsule})}.width(150).flexGrow(1)}.visibility(this.downloadFileInfo.state
Visibility.None).width(100%).padding(10)
{Text(this.msgHistory).textAlign(TextAlign.Start).padding(10).width(100%).backgroundColor(0xeeeeee)}.align(Alignment.Top).backgroundColor(0xeeeeee).height(300).flexGrow(1).scrollable(ScrollDirection.Vertical).scrollBar(BarState.On).scrollBarWidth(20)}.width(100%).justifyContent(FlexAlign.Start).height(100%)}.height(100%)}
session.head(this.downloadFileInfo.url)if
Number.parseInt(resp.headers[content-length].toString())}this.msgHistory
(this.downloadFileInfo.totalSize
{this.downloadFileInfo.totalSize
(this.downloadFileInfo.totalSize
truethis.downloadFileInfo.state
this.downloadFileInfo.downloadedSizelet
fs.openSync(this.downloadFileInfo.filePath,
fs.OpenMode.READ_WRITE)fs.lseek(localFile.fd,
(this.downloadFileInfo.downloadedSize
this.downloadFileInfo.totalSize
this.downloadFileInfo.totalSize)
this.downloadFileInfo.totalSize
this.downloadPartFile(startIndex,
this.downloadFileInfo.downloadedSize
(this.downloadFileInfo.downloadedSize
this.downloadFileInfo.totalSize)
文件下载完成\r\n}fs.closeSync(localFile.fd)}
rcp.Request(this.downloadFileInfo.url,
GET);this.currentReq.transferRange
this.currentSession.fetch(this.currentReq)
服务器状态响应异常状态码${resp.statusCode}\r\nreturn
resp.body)fs.fsyncSync(localFile.fd)return
picker.DocumentSaveOptions();let
picker.DocumentViewPicker(getContext(this));await
documentPicker.save(documentSaveOptions).then((result:
要实现断点续传功能关键点在于事先获取文件的大小以及每次请求时获取文件的一部分数据获取文件大小是通过函数getDownloadFileSize实现的在这个函数里通过http的head方法可以只获取响应的首部其中包括文件的大小获取文件部分数据是通过设置请求的transferRange属性实现的
rcp.Request(this.downloadFileInfo.url,
GET);this.currentReq.transferRange
this.currentSession.fetch(this.currentReq)
另外示例支持应用退出以及重启后的断点续传这一点是通过PersistenceV2实现的把断点续传下载文件信息自动进行持久化存储下次启动时还可以自动加载从而实现了完全的文件断点续传。
当然这个示例还有很多需要完善的地方比如可以在重启后的断点续传前重新获取文件大小并且和本地进行比较防止服务端文件发生变化。
https://gitee.com/zl3624/harmonyos_network_samples/tree/master/code/rcp/RCPDownloadFileDemo
https://gitee.com/zl3624/harmonyos_network_samples
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback