2015-04-23 49 views
0

我有以下腳本,允許我將文件上傳到用戶文件。它不適用於大文件(例如1GB)。可以做出什麼改變?使用Python中的請求庫進行文件上傳

import requests 

import random 

import re 

filehandle = open("menu.avi", "rb") 

resp=requests.get("https://usersfiles.com/") 

sess_id = re.search('sess_id.*=?"(.*)?"', str(resp.text)).group(1) 

srv_tmp_url = re.search('srv_tmp_url.*=?"(.*)?"', str(resp.text)).group(1) 

upload_type = re.search('upload_type.*=?"(.*)?"', str(resp.text)).group(1) 

UID = '' 

for i in range(0, 12): 

    UID = UID + '' + str(random.randint(0,10)) 

url2="https://up11.usersfiles.com/cgi-bin/upload.cgi?upload_id="+UID+"&js_on=1&utype=reg&upload_type="+upload_type 

r = requests.post(url2, data={"upload_type":upload_type , "sess_id":sess_id, 
           "srv_tmp_url":srv_tmp_url}, files = {"file_0":filehandle}) 

link_usersfiles = re.search('name=.fn.>(.*?)<', str(r.text)).group(1) 

這個腳本生成我的錯誤:

body.write(data)

MemoryError

回答

0

默認情況下上傳文件時,requests將整個文件讀取到內存中,所以容易上傳大文件時用完。最簡單的方法是安裝requests-toolbelt它可以很容易地傳輸文件上傳。

對於你的榜樣,你可以使用這樣的事情:

import requests 
from requests_toolbelt.multipart.encoder import MultipartEncoder 

# ... code for preparing for upload ... 

m = MultipartEncoder(
    fields={'upload_type': upload_type, 'sess_id': sess_id, 
      'file_0': ('filename', file handle, 'text/plain')} 
    ) 

r = requests.post(url2, data=m, 
        headers={'Content-Type': m.content_type}) 

欲瞭解更多信息,請參閱https://toolbelt.readthedocs.org/en/latest/uploading-data.html

+0

它完美。非常感謝你 – Marco