2010-07-13 47 views
2

我目前使用下面的代碼上傳一個文件到遠程服務器:如何獲取urllib2的上傳進度條?

import MultipartPostHandler, urllib2, sys 
cookies = cookielib.CookieJar() 
opener = urllib2.build_opener(MultipartPostHandler.MultipartPostHandler) 
params = {"data" : open("foo.bar") } 
request=opener.open("http://127.0.0.1/api.php", params) 
response = request.read() 

這工作得很好,但對於更大的文件上傳需要一些時間,這將是很好的有一個回調允許我顯示上傳進度?

我已經嘗試過kodakloader解決方案,但它沒有單個文件的回調。

有沒有人知道解決方案?

回答

1

我認爲用urllib2知道上傳進度是不可能的。我正在研究使用pycurl。

+0

它看起來像這樣解決了我的問題:http://pycurl.sourceforge.net/doc/callbacks.html – leoluk 2010-08-16 14:16:55

3

下面是我們的python依賴腳本中的代碼片段,其中Chris Phillips和我工作在@Cogi(儘管他做了這個特定的部分)。完整的腳本是here

try: 
     tmpfilehandle, tmpfilename = tempfile.mkstemp() 
     with os.fdopen(tmpfilehandle, 'w+b') as tmpfile: 
      print ' Downloading from %s' % self.alternateUrl 

      self.progressLine = '' 
      def showProgress(bytesSoFar, totalBytes): 
       if self.progressLine: 
        sys.stdout.write('\b' * len(self.progressLine)) 

       self.progressLine = ' %s/%s (%0.2f%%)' % (bytesSoFar, totalBytes, float(bytesSoFar)/totalBytes * 100) 
       sys.stdout.write(self.progressLine) 

      urlfile = urllib2.urlopen(self.alternateUrl) 
      totalBytes = int(urlfile.info().getheader('Content-Length').strip()) 
      bytesSoFar = 0 

      showProgress(bytesSoFar, totalBytes) 

      while True: 
       readBytes = urlfile.read(1024 * 100) 
       bytesSoFar += len(readBytes) 

       if not readBytes: 
        break 

       tmpfile.write(readBytes) 
       showProgress(bytesSoFar, totalBytes) 

    except HTTPError, e: 
     sys.stderr.write('Unable to fetch URL: %s\n' % self.alternateUrl) 
     raise 
+1

這顯示下載的進度,是否正確?該問題要求進度條上傳... – priestc 2010-07-20 07:24:39