VFP 愛用者社區 首頁 VFP 愛用者社區
本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
 
 常見問題常見問題   搜尋搜尋   會員列表會員列表   會員群組會員群組   會員註冊會員註冊 
 個人資料個人資料   登入檢查您的私人訊息登入檢查您的私人訊息   登入登入

纯VF实现HTTP带进度条的多'线程'断点下载

 
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區
上一篇主題 :: 下一篇主題  
發表人 內容
行者孙



註冊時間: 2006-03-11
文章: 43


第 1 樓

發表發表於: 星期三 九月 06, 2006 10:21 am    文章主題: 纯VF实现HTTP带进度条的多'线程'断点下载 引言回覆


最近写一个小东西,要求有在线更新功能,碰到这样的问题首先想到了Msxml2.XMLHTTP和ADODB.Stream,最后同步下载到是实现了,但却被异步下载难倒了,后来找了大量的VC、VB、ASP、.NET等代码来参考,但始终很难在VF上直接实现,后来又转想到了WIDOWS的WININET(Microsoft Internet Transfer Control )控件,大家知道inet也有同步和异步两种方式,我们常用的获得网页源码的方法如:

thisform.inet.openurl('www.163.com')这样我们就得到了163主页的源代码,同样thisform.inet.openurl('http://www.vfptop.com/download/ydgl.rar',1)

这样的话我们就获得了ydgl.rar文件的全部内容,再新建立一个文件把得到的内容写进去就算是把ydgl.rar这个文件下载下来了,但是这样做是一次性把整个文件的内容全部下载,没办法实现进度表达,所以我们要采用异步方式来获取,也就是inet.execute(url),知道了这些就可以写代码了:

实现进度显示的步骤:

1、首先获取被下载文件的大小

我们知道在访问一个URL的时候会首先返回一个HTTP头文件,这文件头里包含有被下载文件相关重要信息,如这样一个THHP头:

HTTP/1.1 200 OK

Server: Microsoft-IIS/5.0

Date: Wed, 16 Aug 2006 09:20:34 GMT

Content-Type: application/octet-stream

Accept-Ranges: bytes

Last-Modified: Mon, 14 Aug 2006 01:50:10 GMT

ETag: "3ac82dfa43bfc61:dae"

Content-Length: 10248

这里的Content-Length头部分显示的就是我们要下载文件的大小,这个数值我们可以用

inet.getheader(‘Content-Length’)来获得。
inet.getheader(‘Content-Length’)&&返回文件大小,字符型。

2、按段下载数据

知道了文件的大小,接下来就是要一段一段的来获取文件的数据,比如已知一个文件的大小是10M(10*1024*1024bety),我们下载的时候每次按1024KB来下载,那么一共要下载10次才能下载完,如果我们把这10次下载的任务交给10个inet去完成,那就变成了‘多线程’下载了,当然这里的‘多线程’实际上是多任务下载不是真正的多线程。

inet.execute(url,'get',,’ Range: bytes=0-’)这句的意思是获取被下载文件的头部一直尾部的全部数据,也就是整个文件。

inet.execute(url,'get',,’ Range: bytes=1024-2101’)这句的意思是获取被下载文件的1024字节到2101字节的部数据。

这样我们就可以很好的给inet分配下载段了。

inet.execute()获取了数据后,我们再用inet.GetChunk(size,1)来从缓冲区获取数据,这里的size是指你要获得的字节数。

这样我们就可以一段一段的下载文件了,实现进度条显示就解决了

3、显示进度信息

进度信息基本上靠一个timer就能刷新下载剩余量、下载百分比、下载剩余时间等进度信息了,这里就不多说了。

4、一些需要注意的地方

a. 分段下载的过程是个循环下载的过程,但我们却不能用for或者do whil这样的循环去操作,因为下载每一断的时候都是有延时的,由于VF是单线程顺序执行代码,所以这样操作一般都会失败,那么我们就采用计数变量来不逐一循环激发inet.execute()和inet.GetChunk(),比如我们是分100段来下载文件,当计数变量<=100的情况下就循环激发,也就是inet.GetChunk()后再去激发inet.execute()然后inet.execute()又去激发inet.GetChunk(),达到100的时候我们再看下这时候文件是否全部下载完毕,如果没有那么再把剩下的数据补进去就行了。

b. inet.GetChunk()获取的数据类型是和文件数据类型一致的,所以我们直接fcraete()建立一个文件,然后把获得数据直接fwrite() 就可以了。

c. 一般最少用两个inet来操作会更方便点,一个是获取文件信息,一个是专门下载数据。当然你非要用一个也是可以的。

d. 每个inet执行结束后最好inet.objiect.cancel,因为有些被下载的文件不支持多线程下载。

e. 段点续载你可以象flashget等软件先建立一个自己的文件结构,等下载完毕后再还原文件,如果补这样的话,比如有和你上次没下载完的文件同名的文件就补会看作是自己没下载完的文件了,续载的时候先检查下已存在的同名文件是否是自己以前下载过的文件这种情况就可以避免了。

想到那里说到那里,难免有错误的地方!
-------------------
VFP应用程式算法群 12787940 行者孙
-------------------

[/img]
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 參觀發表人的個人網站
Jimsun



註冊時間: 2006-03-21
文章: 11


第 2 樓

發表發表於: 星期五 九月 22, 2006 9:17 am    文章主題: 引言回覆

耳目一新,我又学到了一招!
受教了!
回頂端
檢視會員個人資料 發送私人訊息
sendera



註冊時間: 2005-02-20
文章: 23


第 3 樓

發表發表於: 星期六 九月 23, 2006 12:26 pm    文章主題: 引言回覆

good!! 謝謝分享
回頂端
檢視會員個人資料 發送私人訊息
計星飛



註冊時間: 2003-08-28
文章: 9


第 4 樓

發表發表於: 星期日 十一月 05, 2006 3:49 pm    文章主題: 引言回覆

好東西,怎么沒有下載鏈接呢?
_________________
我愛VFP
回頂端
檢視會員個人資料 發送私人訊息
zgc988



註冊時間: 2004-10-19
文章: 2


第 5 樓

發表發表於: 星期日 十一月 05, 2006 9:03 pm    文章主題: 引言回覆

如何下载?
回頂端
檢視會員個人資料 發送私人訊息
alovexjh



註冊時間: 2005-12-28
文章: 13
來自: 中國

第 6 樓

發表發表於: 星期二 十一月 14, 2006 10:33 am    文章主題: 引言回覆

?怎么没有下载连接?~oo
_________________
小學上語文課時,老師講到帥字,我百思不得其解,旁邊得小妹妹偷偷遞過一把小鏡子一照,剎那間我明白了!
回頂端
檢視會員個人資料 發送私人訊息 雅虎訊息通 MSN Messenger
goto-dream



註冊時間: 2004-05-11
文章: 909


第 7 樓

發表發表於: 星期二 十一月 25, 2008 6:44 pm    文章主題: 引言回覆

沒有下載點....
_________________
福隆昌淨水有限公司--淨水器的專家,淨水器,飲水機,濾心!!

想了解更多,您可上幸福雞湯組.找尋!!丁澐瑄.老師.

          愛作夢
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件
garfield
Site Admin


註冊時間: 2003-01-30
文章: 2157


第 8 樓

發表發表於: 星期三 十一月 26, 2008 9:17 am    文章主題: 引言回覆

可以到行者孫的blog 看一看
http://hi.baidu.com/myvfp/blog/item/bb4669d3a997aedca8ec9a04.html/cmtid/d76b80d5a23580cc50da4b67

_________________
利用>>搜尋<<的功能會比問的還要快得到答案.
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件
goto-dream



註冊時間: 2004-05-11
文章: 909


第 9 樓

發表發表於: 星期四 十二月 04, 2008 11:39 am    文章主題: 引言回覆

謝謝提供...很實用的網站
跟這裡 一樣

_________________
福隆昌淨水有限公司--淨水器的專家,淨水器,飲水機,濾心!!

想了解更多,您可上幸福雞湯組.找尋!!丁澐瑄.老師.

          愛作夢
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件
從之前的文章開始顯示:   
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區 所有的時間均為 台北時間 (GMT + 8 小時)
1頁(共1頁)

 
前往:  
無法 在這個版面發表文章
無法 在這個版面回覆文章
無法 在這個版面編輯文章
無法 在這個版面刪除文章
無法 在這個版面進行投票
無法 在這個版面附加檔案
無法 在這個版面下載檔案


Powered by phpBB © 2001, 2005 phpBB Group
正體中文語系由 phpbb-tw 維護製作