继续中止下载?

Posted

技术标签:

【中文标题】继续中止下载?【英文标题】:Resume aborted download? 【发布时间】:2012-05-06 11:45:25 【问题描述】:

我很少有 PC 在慢速 Internet 连接网络上运行 + 他们使用 ***,因此连接变得非常慢。 我有自己的应用程序,必须通过 HTTP 从外部服务器下载更新,但如果更新大约为几 MB,则不会下载。 所以我要问的是如何实现下载方法,以便在连接中止时恢复下载。

我在 Windows,C++ 上编写代码,如果我可以使用 WinAPI 实现这一点,那就太好了。

我认为Internet Explorer有这个功能,所以必须用WININET来实现。

【问题讨论】:

到目前为止你尝试过什么?有数百个如何在网上下载东西的示例。 当有不错的独立于平台的 API 可以为您做到这一点(而且通常更易于使用)时,您为什么如此热衷于使用 WINAPI。例如非常流行的 libcurl。 w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35 【参考方案1】:

HTTP 恢复有点用词不当,因为连接通常在下载“暂停”时终止,然后在恢复时发出新请求。

然后新请求包含范围规范,因此服务器只发送整个请求文件的一部分。

通常您会首先触发 HEAD 请求以获取整个文件大小。

请求

HEAD /big_file.zip HTTP/1.1
Host: www.example.com

回应

HTTP/1.0 200 OK
Accept-Ranges: bytes
Content-Length: 2000000
Content-Type: application/zip

然后您可以发送这样的请求以仅下载 1,000,000 到 2,000,000 字节(如果您的第一次下载停止在 1,000,000 字节):

请求

GET /big_file.zip HTTP/1.1
Host: example.com
Range: bytes=1000000,2000000

回应

HTTP/1.0 206 Partial Content
Accept-Ranges: bytes
Content-Length: 1000000
Content-Range: bytes 1000000-2000000/2000000
Content-Type: image/jpeg

...

这将是一般原则。您可以使用 cUrl、boost::asio、Windows 套接字等在 C++ 中实现它……有许多不同的方法和许多好的教程。

【讨论】:

WinInet 也通过添加所需的标头字符串来支持这一点。

以上是关于继续中止下载?的主要内容,如果未能解决你的问题,请参考以下文章

W/DownloadManager:中止下载请求 17:无法创建目标文件 /storage/emulated/0/Ringtone/Fav_Ringtone.mp3

youtube-dl 下载在播放列表上停止,视频丢失

解决Java使用response下载文件报错,并总结可能出错的原因: java.io.IOException: 你的主机中的软件中止了一个已建立的连接。

Android:intentservice,如何中止或跳过handleintent队列中的任务

中止路由并继续.NET中的原始请求[重复]

Can't rake:db migrate - 继续让 'rake 中止!加载错误' [重复]