Skynet

---------- ---------- 我的新 blog : liukaiyi.cublog.cn ---------- ----------

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  112 Posts :: 1 Stories :: 49 Comments :: 0 Trackbacks

我这就抛砖引玉了,大家多指教。

参考:
http://pycurl.sourceforge.net/doc/pycurl.html
如果想多线程下载,请关注下面url
   http://groups.google.com/group/python-cn/msg/cdbe671b814fd3af
http://www.pythonclub.org/doku/index.php/python-network-application/pycurl

(个人粗略认为)原理:
     把服务器上的文件分n“等份”,再在准备下载地址按等分一一填充到文件中。
     当 下载 “等份数据” 时如果未能正常结束,从头下载次等份数据。正常结束后线程下载下一等分。

   好比:
   服务器文件(x):  1111111
   待填充文件(y): 0000000
   运行1:(2分钟)
     文件(x):0101001 
   接着运行2:(1分钟,断点续传)
     文件(x):1111001

   最后:文件(x):1111111


需要技术:
    1.按切割下载
    2.本地创造与服务器文件一样大小空文件。
    2.等份写入


 技术1代码(按切割下载).
c.setopt(pycurl.RANGE, '%d-%d' % (5001000))
 
import pycurl
= pycurl.Curl()
c.setopt(pycurl.URL, 
"http://www.python.org/")
c.setopt(pycurl.HTTPHEADER, [
"Accept:"])
import StringIO
= StringIO.StringIO()
c.setopt(pycurl.WRITEFUNCTION, b.write)
c.setopt(pycurl.FOLLOWLOCATION, 
1)
c.setopt(pycurl.MAXREDIRS, 
5)
c.setopt(pycurl.RANGE, 
'%d-%d' % (5001000))
c.perform()
print b.getvalue()
 

技术2(本地创造与服务器文件一样大小空文件)
    def allocate_space(self):
        
'''
        预分配文件空间(通用?)
        
'''
        afile 
= file(self.url_info['file'], 'wb')
        afile.truncate(self.url_info[
'size'])#文件大小限定
        afile.close()

技术3(等份写入 file.seek):
    #----关键----
    def write_cb(self, data):
        
if self.piece:
            self.result.seek(self.piece[
1+ self.piece_downloaded, 0)
        self.result.write(data)
        self.result.flush()
        size 
= len(data)
        self.link_downloaded 
+= size
        self.piece_downloaded 
+= size
        self.total_downloaded 
+= size
        
if self.is_stop: return -1


pycurl 学习笔记:
$ftp读取
import pycurl
tfile
='ftp://name:pass@218.200.***.***/tongbu/test.txt'
= pycurl.Curl()
c.setopt(pycurl.URL, tfile)
import StringIO
= StringIO.StringIO()
c.setopt(pycurl.WRITEFUNCTION, b.write)
c.setopt(pycurl.FOLLOWLOCATION, 
1)
c.setopt(pycurl.MAXREDIRS, 
5)
#c.setopt(pycurl.RANGE, '%d-%d' % (2, 6))
c.perform()
print b.getvalue()

下载写入:
    bean_pycurl=pycurl.Curl()
    ...
   
    bean_
pycurl.setopt(pycurl.WRITEFUNCTION, write_cb)
    ...

    
def write_cb(data):
        file.write(data)
        ..



  


整理 www.blogjava.net/Good-Game
posted on 2009-01-07 19:37 刘凯毅 阅读(4781) 评论(1)  编辑  收藏 所属分类: python

Feedback

# re: python 断点续传 (个人理解) 2009-01-11 23:30 爱吃鱼头
只用java写过断点续传的程序,这里见到python版本,不错的说  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: