Skynet

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

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            112 Posts :: 1 Stories :: 49 Comments :: 0 Trackbacks

          我這就拋磚引玉了,大家多指教。

          參考:
          http://pycurl.sourceforge.net/doc/pycurl.html
          如果想多線程下載,請關(guān)注下面url
             http://groups.google.com/group/python-cn/msg/cdbe671b814fd3af
          http://www.pythonclub.org/doku/index.php/python-network-application/pycurl

          (個人粗略認(rèn)為)原理:
               把服務(wù)器上的文件分n“等份”,再在準(zhǔn)備下載地址按等分一一填充到文件中。
               當(dāng) 下載 “等份數(shù)據(jù)” 時如果未能正常結(jié)束,從頭下載次等份數(shù)據(jù)。正常結(jié)束后線程下載下一等分。

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

             最后:文件(x):1111111


          需要技術(shù):
              1.按切割下載
              2.本地創(chuàng)造與服務(wù)器文件一樣大小空文件。
              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)造與服務(wù)器文件一樣大小空文件)
              def allocate_space(self):
                  
          '''
                  預(yù)分配文件空間(通用?)
                  
          '''
                  afile 
          = file(self.url_info['file'], 'wb')
                  afile.truncate(self.url_info[
          'size'])#文件大小限定
                  afile.close()

          技術(shù)3(等份寫入 file.seek):
              #----關(guān)鍵----
              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 學(xué)習(xí)筆記:
          $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 劉凱毅 閱讀(4798) 評論(1)  編輯  收藏 所屬分類: python

          Feedback

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

          主站蜘蛛池模板: 体育| 枣强县| 监利县| 公主岭市| 霍城县| 阳谷县| 桓台县| 称多县| 怀远县| 镇江市| 中西区| 介休市| 泰兴市| 贵德县| 阿拉善盟| 昌都县| 定安县| 晋江市| 汽车| 册亨县| 旌德县| 阳城县| 姚安县| 施甸县| 漠河县| 遂溪县| 睢宁县| 新沂市| 上杭县| 阳原县| 武安市| 简阳市| 扬州市| 东安县| 沁源县| 镇赉县| 梁平县| 华蓥市| 错那县| 威信县| 双流县|