qq_39201064 2021-06-08 17:52 采纳率: 25%
浏览 34
已结题

文件下载,如果用户中止下载,后台怎么知道?

现在我们有一个需求,后台系统上传设备升级包,设定提示时间

根据时间通过定时任务发送通知给用户,如果用户点击更新

就调用文件下载接口

需求:

1.用户暂停下载后,如果点击继续下载就延续上一次继续下载

2.如果用户点击了取消下载就直接取消了

那么问题来了,如果用户取消下载或者暂停下载,后台需要怎么做?怎么感知到用户已经取消下载或者暂停下载

现在我做出来的效果:如果是服务器的问题导致下载失败,就会延续上一次继续下载

  • 写回答

1条回答 默认 最新

  • XKIND 2021-06-08 18:04
    关注

    一个最简单的断点续传实现大概如下:

    1.客户端下载一个1024K的文件,已经下载了其中512K

    2. 网络中断,客户端请求续传,因此需要在HTTP头中申明本次需要续传的片段:

    Range:bytes=512000-

    这个头通知服务端从文件的512K位置开始传输文件

    3. 服务端收到断点续传请求,从文件的512K位置开始传输,并且在HTTP头中增加:

    Content-Range:bytes 512000-/1024000

    并且此时服务端返回的HTTP状态码应该是206,而不是200。

    但是在实际场景中,会出现一种情况,即在终端发起续传请求时,URL对应的文件内容在服务端已经发生变化,此时续传的数据肯定是错误的。如何解决这个问题了?显然此时我们需要有一个标识文件唯一性的方法。在RFC2616中也有相应的定义,比如实现Last-Modified来标识文件的最后修改时间,这样即可判断出续传文件时是否已经发生过改动。同时RFC2616中还定义有一个ETag的头,可以使用ETag头来放置文件的唯一标识,比如文件的MD5值。

    终端在发起续传请求时应该在HTTP头中申明If-Match 或者If-Modified-Since 字段,帮助服务端判别文件变化。

    另外RFC2616中同时定义有一个If-Range头,终端如果在续传是使用If-Range。If-Range中的内容可以为最初收到的ETag头或者是Last-Modfied中的最后修改时候。服务端在收到续传请求时,通过If-Range中的内容进行校验,校验一致时返回206的续传回应,不一致时服务端则返回200回应,回应的内容为新的文件的全部数据。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 8月5日

悬赏问题

  • ¥30 STM32 INMP441无法读取数据
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境