Skynet

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

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            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“等份”,再在準備下載地址按等分一一填充到文件中。
               當 下載 “等份數(shù)據(jù)” 時如果未能正常結(jié)束,從頭下載次等份數(shù)據(jù)。正常結(jié)束后線程下載下一等分。

             好比:
             服務器文件(x):  1111111
             待填充文件(y): 0000000
             運行1:(2分鐘)
               文件(x):0101001 
             接著運行2:(1分鐘,斷點續(xù)傳)
               文件(x):1111001

             最后:文件(x):1111111


          需要技術(shù):
              1.按切割下載
              2.本地創(chuàng)造與服務器文件一樣大小空文件。
              2.等份寫入


           技術(shù)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()
           

          技術(shù)2(本地創(chuàng)造與服務器文件一樣大小空文件)
              def allocate_space(self):
                  
          '''
                  預分配文件空間(通用?)
                  
          '''
                  afile 
          = file(self.url_info['file'], 'wb')
                  afile.truncate(self.url_info[
          'size'])#文件大小限定
                  afile.close()

          技術(shù)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.aygfsteel.com/Good-Game
          posted on 2009-01-07 19:37 劉凱毅 閱讀(4794) 評論(1)  編輯  收藏 所屬分類: python

          Feedback

          # re: python 斷點續(xù)傳 (個人理解) 2009-01-11 23:30 愛吃魚頭
          只用java寫過斷點續(xù)傳的程序,這里見到python版本,不錯的說  回復  更多評論
            

          主站蜘蛛池模板: 兰溪市| 神农架林区| 津市市| 通城县| 寿宁县| 连平县| 长宁县| 康马县| 宝兴县| 永城市| 六安市| 营口市| 桦南县| 陆良县| 屏南县| 耿马| 临武县| 泊头市| 阳信县| 三都| 安福县| 景洪市| 平定县| 石门县| 金川县| 河曲县| 北票市| 霍邱县| 贵溪市| 汝阳县| 莱阳市| 醴陵市| 方城县| 巨野县| 永嘉县| 三河市| 彝良县| 夏津县| 河西区| 岳池县| 穆棱市|