2016-03-03 10 views
6

मैं अतिरिक्त डेटा के साथ बड़ी फ़ाइल अपलोड करने के तरीकों के आसपास देख रहा हूं, लेकिन ऐसा कोई समाधान नहीं लगता है। फाइल को अपलोड करने के लिए, मैं इस कोड का उपयोग किया गया है और यह छोटी फ़ाइल से ठीक काम कर रहा गया है:पायथन अनुरोध अतिरिक्त डेटा के साथ बड़ी फ़ाइल अपलोड करें

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) 

समस्या यह है कि कोड भेजने से पहले पूरी फ़ाइल को लोड करता है, और मैं जब बड़े अपलोड करने MemoryError में चलाने होगा फ़ाइलें। मैं चारों ओर देखा है, और जिस तरह से डेटा स्ट्रीम करने के लिए

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

स्थापित करने के लिए है, लेकिन मैं जोड़ने की जरूरत है { "समग्र": "कोई नहीं"} आंकड़ों के। यदि नहीं, तो सर्वर फ़ाइल को पहचान नहीं पाएगा।

+0

models.py, PreparedRequest क्लास, ready_body विधि में कोड को देखते हुए, अतिरिक्त डेटा के साथ बड़ी फ़ाइल अपलोड करने के लिए अनुरोधों का उपयोग करने का कोई तरीका नहीं है। –

उत्तर

5

ऐसा करने के लिए requests-toolbelt उपयोग कर सकते हैं:

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) 

यह आपके लिए multipart/form-data अपलोड स्ट्रीम करने के लिए अनुरोध का कारण होगा।

+0

बहुत बहुत धन्यवाद! मुझे याद है कि अनुरोधों से पहले टूलबेल आ रहा है, लेकिन हेडर में सामग्री-प्रकार डालने का विचार नहीं किया! –

+0

हाँ टूलबल्ट के लिए प्रलेखन स्पष्ट रूप से कहता है कि आपको इसकी आवश्यकता है। :) –

संबंधित मुद्दे