获取网站上文件的url,根据url下载文件,how?

sjy88813 2011-07-21 11:27:29
1.如何给放网站上一个文件。
2.让该文件对应一个url。
3,实现从该url下载该文件到本地(和在本地copy一样?)
4,断点续传。(先考虑上面3条)

首先不清楚怎样让url对应一个文件,我在本机创建了一个默认网站,怎么给这个网站添加一个文件,然后怎么这个文件对应一个url地址?
假如我的网站是http://localhost, 默认存储路径:c:\inetpub\wwwroot,如果要添加一个abc.txt的文件,怎么得url?

还有这个下载文件是怎么实现啊,是用socket? http?还是什么别的,需要看什么资料?

准备写一个函数实现传进来一个url地址,然后把对应的文件保存在本地。(C++,not mfc)
首先应该解析url对吧,然后实现下载,是先去那个网站,打开那个文件,再用socket传到本地,保存?

断点重传据说要多线程。。。还没接触,没想法。

看了有个函数 URLDownloadToFile ..这个是不是CHttpDownload类里的,好像还是mfc吧。。。
...全文
1662 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
shiweifu 2011-07-25
  • 打赏
  • 举报
回复
LZ要找的是libcurl
一叶之舟 2011-07-25
  • 打赏
  • 举报
回复
参考一下
http://www.2cto.com/kf/201103/84525.html

在前面的文章曾讨论了HTTP消息头的三个和断点继传有关的字段。一个是请求消息的字段Range,另两个是响应消息字段Accept-Ranges和Content-Range。其中Accept-Ranges用来断定Web服务器是否支持断点继传功能。在这里为了演示如何实现断点继传功能,假设Web服务器支持这个功能;因此,我们只使用Range和Content-Range来完成一个断点继传工具的开发。


l 要实现一个什么样的断点续传工具?

这个断点续工具是一个单线程的下载工具。它通过参数传入一个文本文件。这个文件的格式如下:

http://www.ishare.cc/d/1174254-2/106.jpg d:ok1.jpg 8192
http://www.ishare.cc/d/1174292-2/156.jpg d:ok2.jpg 12345
http://www.ishare.cc/d/1174277-2/147.jpg d:ok3.jpg 3456

这个文本文件的每一行是一个下载项,这个下载项分为三部分:

要下载的Web资源的URL。
要保存的本地文件名。
下载的缓冲区大小(单位是字节)。
使用至少一个空格来分隔这三部分。这个下载工具逐个下载这些文件,在这些文件全部下载完后程序退出。

l 断点续传的工作原理

“断点续传”顾名思义,就是一个文件下载了一部分后,由于服务器或客户端的原因,当前的网络连接中断了。在中断网络连接后,用户还可以再次建立网络连接来继续下载这个文件还没有下完的部分。

要想实现单线程断点续传,必须在客户断保存两个数据。

1. 已经下载的字节数。

2. 下载文件的URL。

一但重新建立网络连接后,就可以利用这两个数据接着未下载完的文件继续下载。在本下载工具中第一种数据就是文件已经下载的字节数,而第二个数据在上述的下载文件中保存。

在继续下载时检测已经下载的字节数,假设已经下载了3000个字节,那么HTTP请求消息头的Range字段被设为如下形式:

Range: bytes=3000-
HTTP响应消息头的Content-Range字段被设为如下的形式:

Content-Range: bytes 3000-10000/10001
l 实现断点续传下载工具

一个断点续传下载程序可按如下几步实现:

1. 输入要下载文件的URL和要保存的本地文件名,并通过Socket类连接到这个URL

所指的服务器上。

2. 在客户端根据下载文件的URL和这个本地文件生成HTTP请求消息。在生成请求

消息时分为两种情况:

(1)第一次下载这个文件,按正常情况生成请求消息,也就是说生成不包含Range

字段的请求消息。

(2)以前下载过,这次是接着下载这个文件。这就进入了断点续传程序。在这种情况生成的HTTP请求消息中必须包含Range字段。由于是单线程下载,因此,这个已经下载了一部分的文件的大小就是Range的值。假设当前文件的大小是1234个字节,那么将Range设成如下的值:

Range:bytes=1234-
3. 向服务器发送HTTP请求消息。

4. 接收服务器返回的HTTP响应消息。

5. 处理HTTP响应消息。在本程序中需要从响应消息中得到下载文件的总字节数。如

果是第一次下载,也就是说响应消息中不包含Content-Range字段时,这个总字节数也就是Content-Length字段的值。如果响应消息中不包含Content-Length字段,则这个总字节数无法确定。这就是为什么使用下载工具下载一些文件时没有文件大小和下载进度的原因。如果响应消息中包含Content-Range字段,总字节数就是Content-Range:bytes m-n/k中的k,如Content-Range的值为:

Content-Range:bytes 1000-5000/5001
则总字节数为5001。由于本程序使用的Range值类型是得到从某个字节开始往后的所有字节,因此,当前的响应消息中的Content-Range总是能返回还有多少个字节未下载。如上面的例子未下载的字节数为5000-1000+1=4001。

一叶之舟 2011-07-25
  • 打赏
  • 举报
回复
HTTP中的Get方法是支持断点续传的。
例如http://www.wohu.com是表示下载搜索的主页,(从头下载)
http://i3.itc.cn/20110722/781_d195170e_97ee_7513_0957_d71d5999e2f9_1.jpg表示下载图片文件,如果要实现断点续传,在第一次下载时你要记录这个文件总的大小,在接收数据的过程中在本地文件中记录下载到什么位置(也就是已经下载了多少字节),如果中间断了,下次下载的时候就带该参数,表示从这个位置开始下载,并将新接收的数据和前面的下载续接一起就可以。如
http://i3.itc.cn/20110722/781_d195170e_97ee_7513_0957_d71d5999e2f9_1.jpg?begin=1028,表求从1028字节这个地方下载,现在的各种HTTP服务器都支持这类功能,?begin=1028是我写的一个例子,具体语法规格参考一下,因为时间太长没用过一时记得不太清楚,见谅。
sjy88813 2011-07-24
  • 打赏
  • 举报
回复
了解了文件下载的功能,
在这说下实现方法,我博客上转载了个文章,讲的实现没有断点续传功能的文件下载。
如果要实现断点续传文件下载,就要写http请求头,
参考:
http://blog.csdn.net/goodname008/article/details/568668
ningto.com 2011-07-21
  • 打赏
  • 举报
回复
通过IWebBrowser2 Interface可以获取网页上的内容
至善者善之敌 2011-07-21
  • 打赏
  • 举报
回复
网上有很多开源的断点传输代码,楼主可以参考一下,也不是什么新鲜玩意了
sjy88813 2011-07-21
  • 打赏
  • 举报
回复
用URLDownloadToFile可以把文件下载下来,
不过要实现断点续传的功能,好像就没现成的函数了吧,是要重写http中的get方法?添加一个range记录已下载的字节数,然后继续下载?
luciferisnotsatan 2011-07-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 dahuaixiaohuai 的回复:]

用socket实现HTTP协议中的GET方法
[/Quote]
wininet库支持HTTP
至善者善之敌 2011-07-21
  • 打赏
  • 举报
回复
其实还有一种复杂的方法就是通过COM接口进行下载
至善者善之敌 2011-07-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 loaden 的回复:]
URLDownloadToFile
http://msdn.microsoft.com/en-us/library/ms775123%28v=vs.85%29.aspx
C/C++ code
URLDownloadToFile(
0,
"http://expert.csdn.net/Expert/topic/2645……
[/Quote]

+++1,查MSDN,然后GOOGLE,然后BAIDU

老邓总是这么给力!!
老邓 2011-07-21
  • 打赏
  • 举报
回复
URLDownloadToFile
http://msdn.microsoft.com/en-us/library/ms775123%28v=vs.85%29.aspx
URLDownloadToFile(                    
0,
"http://expert.csdn.net/Expert/topic/2645/2645532.xml ",
"2645532.xml.i.have.already.renamed.it! ",
0,
0
);
一叶之舟 2011-07-21
  • 打赏
  • 举报
回复
用socket实现HTTP协议中的GET方法
sjy88813 2011-07-21
  • 打赏
  • 举报
回复
怎么根据url将网站上的文件下载下来,谁知道啊,不用mfc...

65,176

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧