我正在通過POST將一個相當大的文件與urllib2上傳到服務器端腳本。我想顯示一個顯示當前上傳進度的進度指示器。是否有urllib2提供的鉤子或回調允許我監視上傳進度?我知道你可以通過連續調用read()方法進行下載,但是我沒有看到write()方法,只是將數據添加到請求中。urllib2 POST進度監控
10
A
回答
23
這是可能的,但你需要做的幾件事情:
- 僞造出來的urllib2的子系統爲傳遞文件句柄向下至httplib的通過附加
__len__
屬性,這使得len(data)
返回正確的尺寸,用於填充Content-Length標頭。 - 覆蓋文件句柄上的
read()
方法:由於httplib調用read()
您的回調將被調用,讓您計算百分比並更新您的進度欄。import os, urllib2 from cStringIO import StringIO class Progress(object): def __init__(self): self._seen = 0.0 def update(self, total, size, name): self._seen += size pct = (self._seen/total) * 100.0 print '%s progress: %.2f' % (name, pct) class file_with_callback(file): def __init__(self, path, mode, callback, *args): file.__init__(self, path, mode) self.seek(0, os.SEEK_END) self._total = self.tell() self.seek(0) self._callback = callback self._args = args def __len__(self): return self._total def read(self, size): data = file.read(self, size) self._callback(self._total, len(data), *self._args) return data path = 'large_file.txt' progress = Progress() stream = file_with_callback(path, 'rb', progress.update, path) req = urllib2.Request(url, stream) res = urllib2.urlopen(req)
輸出:
large_file.txt progress: 0.68 large_file.txt progress: 1.36 large_file.txt progress: 2.04 large_file.txt progress: 2.72 large_file.txt progress: 3.40 ... large_file.txt progress: 99.20 large_file.txt progress: 99.87 large_file.txt progress: 100.00
這可以與任何類似文件的對象的工作,但我已經包裹file
顯示它如何能與一個真正的大文件,從工作流盤
0
我不認爲這是可能的,但你可以使用pycurl does have upload/download progress callbacks。
+0
我試圖保持它的標準庫。這將分發給Windows用戶,我不希望他們必須安裝額外的東西。 – computergeek6 2011-05-08 03:33:12
+0
那麼如果你想出了一些東西,在這裏分享:) – zeekay 2011-05-08 03:36:01
1
requests 2.0.0 has streaming uploads。這意味着您可以使用生成器生成小塊並打印塊之間的進度。
0
poster支持此
import json
import os
import sys
import urllib2
from poster.encode import multipart_encode
from poster.streaminghttp import register_openers
def _upload_progress(param, current, total):
sys.stdout.write(
"\r{} - {:.0f}% "
.format(param.name,
(float(current)/float(total)) * 100.0))
sys.stdout.flush()
def upload(request_resource, large_file_path):
register_openers()
with open(large_file_path, 'r') as large_file:
request_data, request_headers = multipart_encode(
[('file', largs_file)],
cb=_upload_progress)
request_headers.update({
'X-HockeyAppToken': 'we use this for hockeyapp upload'
})
upload_request = urllib2.Request(request_resource,
request_data,
request_headers)
upload_connection = urllib2.urlopen(upload_request)
upload_response = json.load(upload_connection)
print "Done"
相關問題
- 1. Python監控Handbrake的進度
- 2. PowerShell作業進度監控
- 3. 安卓:SAX解析器進度監控
- 4. 使用HTTPClient 4監控下載進度?
- 5. Java SAX解析器進度監控
- 6. Flex 3多重上傳進度監控
- 7. Python的URLLib/URLLib2 POST
- 8. 監視Rsync進度
- 9. 監控多進程
- 10. 進度監視器:進度間隔
- 11. 正在下載進度條urllib2 python
- 12. Java:顯示進度監視器和子進度監視器的進度
- 13. Python urllib2發送POST數據
- 14. JavaScript速度監控工具?
- 15. iOS5區域監控精度
- 16. 監控電話長度?
- 17. eclipse rcp進度監視器
- 18. php cURL進度監視器?
- 19. 流的進度監視器
- 20. 監視BufferedInputStream下載進度
- 21. 監控遠程進程
- 22. 監控窗口進程
- 23. MixPanel進行錯誤監控
- 24. 在Python中監控進程?
- 25. GWT中的進程監控
- 26. 使用Python對XML負載進行身份驗證HTTP POST urllib2
- 27. Jconsole applet監控:要監控哪個進程?
- 28. AFNetworking 2.0 HTTP POST進度
- 29. 如何監控羣集的HDFS複製進度?
- 30. 用於報告/監控長流程進度的設計模式
爲什麼你把_len_方法?我沒有看到httplib在哪裏或者你使用它,目的是什麼? – MistahX 2011-06-24 02:30:36
它在'urllib2'' AbstractHTTPHandler.do_request _()'和'httplib HttpConnect._send_request()'中使用,其中調用len()來設置Content-length標頭。 –
samplebias
2011-06-24 03:14:42
優雅的解決方案,謝謝! – knutole 2013-05-15 18:55:12