2016-03-03 21 views
6

Ben ek veri ile büyük dosya yükleme yolları için etrafa baktım, ama herhangi bir çözüm gibi görünmüyor. dosya yüklemek için, bu kodu kullanarak oldum ve onu küçük dosya ile ince çalışıyormuş:python istekleri ek dosya ile büyük dosya yükleme

with open("my_file.csv", "rb") as f: 
    files = {"documents": ("my_file.csv", f, "application/octet-stream")} 
    data = {"composite": "NONE"} 
    headers = {"Prefer": "respond-async"} 
    resp = session.post("my/url", headers=headers, data=data, files=files) 

sorun kodu göndermeden önce tüm dosyayı yükleyen olması ve büyük yüklerken hangi MemoryError içine aday olacağını Dosyalar. Etrafa baktım ve veri akışı için bir yol

resp = session.post("my/url", headers=headers, data=f) 

ayarlamaktır ama eklemem gerekiyor { "kompozit": "YOK"} verilere. Değilse, sunucu dosyayı tanımıyordu.

+0

Models.py, PreparedRequest sınıfı, prepare_body yöntemindeki kodlara bakıldığında, büyük veriyi ek verilerle karşıya yüklemek için isteklerin kullanılmasının bir yolu yoktur. –

cevap

5

Bunu yapmak için requests-toolbelt kullanabilirsiniz: Bu senin için multipart/form-data yüklemeyi akarsu isteklerini neden olacaktır

import requests 
from requests_toolbelt.multipart import encoder 

session = requests.Session() 
with open('my_file.csv', 'rb') as f: 
    form = encoder.MultipartEncoder({ 
     "documents": ("my_file.csv", f, "application/octet-stream"), 
     "composite": "NONE", 
    }) 
    headers = {"Prefer": "respond-async", "Content-Type": form.content_type} 
    resp = session.post(url, headers=headers, data=form) 

.

+0

Çok teşekkürler! Önceden istek-araç-etiketine rastladığımı hatırlıyorum ama Content-Type'u başlığa koymayı düşünmedim! –

+0

Evet, alet kemerinin belgeleri oldukça açık bir şekilde buna ihtiyacınız olduğunu söylüyor. :) –