2015-04-23 2 views
0

У меня есть следующий скрипт, который позволяет мне загружать файлы в файлы users. Он не работает для больших файлов (например, 1 ГБ). Какие изменения могут произойти?Загрузка файла с использованием библиотеки запросов в 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

Смежные вопросы