继续中止下载?
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
解决Java使用response下载文件报错,并总结可能出错的原因: java.io.IOException: 你的主机中的软件中止了一个已建立的连接。