2012-05-24 174 views
1

我正在編寫一個python模塊來POST文件到服務器的過程中,我可以上傳大小高達500MB的文件,但是當我嘗試上傳1GB文件時上傳失敗,如果我是使用類似cURL的東西它不會失敗。我在google搜索後得到了使用python上傳multipart formdata的代碼,代碼可以找到here。我剛剛編譯並運行該代碼,我得到的錯誤是這樣的大文件上傳失敗

Traceback (most recent call last): 
    File "<pyshell#7>", line 1, in <module> 
    opener.open("http://127.0.0.1/test_server/upload",params) 
    File "C:\Python27\lib\urllib2.py", line 392, in open 
    req = meth(req) 
    File "C:\Python27\MultipartPostHandler.py", line 35, in http_request 
    boundary, data = self.multipart_encode(v_vars, v_files) 
    File "C:\Python27\MultipartPostHandler.py", line 63, in multipart_encode 
    buffer += '\r\n' + fd.read() + '\r\n' 
MemoryError 

我是新來的python,很難把握它。我也遇到了另一個程序here,老實說我不知道​​如何運行它。我試圖通過基於函數名稱的猜測來運行它,但那不起作用。

+0

也許我誤解了一些東西,但如果服務器的限制是500兆字節,1 GB的上傳應該會失敗。 – kevin628

+0

我沒有設置任何限制,就像我說我可以使用cURL上傳1GB文件。 – cyberbemon

+0

@cyberbemon:回溯顯示代碼試圖在內存中加載整個文件('fd.read()')。要麼爲流程增加一個允許的內存量或者流內容(就像'curl'可能會這樣),請參閱http://stackoverflow.com/questions/2502596/python-http-post-a-large-file-with-streaming – jfs

回答

5

有問題的腳本不是很聰明,在內存中構建POST主體。

因此,要發佈1GB文件,您需要1GB的內存來保存該數據,再加上HTTP標頭,邊界和python以及代碼本身。

你不得不返工腳本使用mmap相反,在那裏你首先該文件裹在mmap.mmap值遞給它傳遞給request.add_data前構建整個身體在一個臨時文件。

請參閱Python: HTTP Post a large file with streaming提示如何實現這一點。

+0

謝謝我會看看它併發布更新,你是否有機會知道如何運行發佈在第二個鏈接上的程序? – cyberbemon

+0

不確定你的意思。 –

+0

有問題[這裏](http://code.activestate.com/recipes/146306/)中發佈了2個鏈接 – cyberbemon