2012-03-02 27 views
1

我想上傳(大)隨機內容到HTTP端點。我創建它,發送它,它永遠不會再使用。所以我想跳過將它保存在臨時文件中,並使用{ 'file':open() },因爲我還需要使用form-urlencoded(而不是multipart)。
我正在使用pycurl及其READFUNCTION選項,但我不想依賴於pycurl。urllib2向上遊寫入

是否可以通過urllib2來實現?

我有這樣的代碼:

def upload(): 
    url = 'http://localhost:9999/' 
    values = {'name' : 'Michael Foord', 
      'location' : 'Northampton', 
      'language' : open(file).read() } 
    data = urllib.urlencode(values) 
    req = urllib2.Request(url, data) 
    response = urllib2.urlopen(req) 
    the_page = response.read() 

但因爲它的立場,當定義整個文件將被讀取。
因此,如果文件是1Gb的大小,這不會工作得很好(除非我誤解了它的工作原理)。另外,我寧願不必創建隨機填充的1Gb文件。


好吧,我可以繼承StringIO的丹尼爾提到的和讀取生成隨機數據(),但我怎麼做的urllib2要求閱讀()上傳而不是一次將所有內容都放在內存中?


在試圖更具體,我真正喜歡的是在Java中類似urlConnectionInstance.getOutputStream(),我可以再寫入到。或者某種方式告訴的urllib2它實際上是上載流傾銷數據從我自己的流中讀取..

回答

2

可以使用httplib的模塊中的Python標準庫: http://docs.python.org/library/httplib.html#httplib.HTTPConnection.request

..Alternatively,它可能是一個打開的文件對象,在這種情況下,文件的內容被髮送;這個文件對象應該支持fileno()和read()方法。 ..

+0

Daniel與Daniel建議一起,這正是我所期待的。即使我在問題中指定了_urllib2_,整個問題就是使用標準庫,而不是_urllib2_專門(我的壞)..謝謝! – 2012-03-05 16:20:39

2

我不知道在什麼地方你有困難,但它聽起來像是你應該在StringIO對象中創建圖像,這是一個像文件一樣的字符串。然後,您可以使用read()方法將此數據包含爲標準的urlencoded請求數據的一部分。

+0

我沒有解釋的確如此(或者我不明白python read())。據我所知,如果我鍵入'values = {'something'= open(file,'r')。read()}'(或用_StringIO_對象),我會在實例化_values_字典時加載整個數據。我想要的是能夠將一些東西傳遞給urllib2,以便在連接後立即調用它並將其寫入流中,同時用大量數據提供它,因此它不會保存在內存中。就像上傳1Gb的隨機數據一樣... – 2012-03-02 12:09:05

0

我認爲主要問題是urllib.urlencode不支持你的方法。如果你創建了一個你自己的類,它有一個read(size)方法可以產生正確編碼的數據塊,這應該適用於data參數。雖然沒有嘗試過。