सिर्फ इसलिए कि आप JSON में संपूर्ण अनुरोध निकाय को नहीं लपेट रहे हैं, इसका मतलब यह नहीं है multipart/form-data
कि JSON और फ़ाइल (दोनों) को एक ही अनुरोध में पोस्ट करने के लिए उपयोग करना उचित नहीं है :
curl -F "metadata=<metadata.json" -F "file=@my-file.tar.gz" http://example.com/add-file
सर्वर की तरफ (स्यूडोकोड के लिए पायथन का उपयोग करके):
class AddFileResource(Resource):
def render_POST(self, request):
metadata = json.loads(request.args['metadata'][0])
file_body = request.args['file'][0]
...
एकाधिक फ़ाइलों को अपलोड करने के लिए, प्रत्येक के लिए अलग-अलग "फ़ॉर्म फ़ील्ड" का उपयोग करना संभव है:
curl -F "metadata=<metadata.json" -F "file1=@some-file.tar.gz" -F "file2=@some-other-file.tar.gz" http://example.com/add-file
... जिस स्थिति में सर्वर कोड होगा request.args['file1'][0]
औरrequest.args['file2'][0]
या कई के लिए एक ही पुन: उपयोग:
curl -F "metadata=<metadata.json" -F "files=@some-file.tar.gz" -F "files=@some-other-file.tar.gz" http://example.com/add-file
... किस स्थिति request.args['files']
में बस लंबाई 2 की सूची होगी।
या एक ही क्षेत्र के माध्यम से कई फाइलें पास करें:
curl -F "metadata=<metadata.json" -F "files=@some-file.tar.gz,some-other-file.tar.gz" http://example.com/add-file
...कौनसे मामलेमें request.args['files']
में सभी फ़ाइलों वाली एक स्ट्रिंग होगी, जिसे आपको खुद को पार्स करना होगा - यह सुनिश्चित नहीं करना है कि यह कैसे करना है, लेकिन मुझे यकीन है कि यह मुश्किल नहीं है, या बेहतर है कि पिछले दृष्टिकोण का उपयोग करें।
के बीच का अंतर है @
और <
वह है@
कारणों फ़ाइल एक फ़ाइल अपलोड के रूप में संलग्न करने के लिए है, जबकि <
देता एक पाठ क्षेत्र के रूप में फ़ाइल की सामग्री।
PS सिर्फ इसलिए कि मैं अनुरोधों curl
को उत्पन्न करने के तरीके के रूप में उपयोग कर रहा हूं, POST
इसका मतलब यह नहीं है कि सटीक HTTP अनुरोधों को प्रोग्रामिंग भाषा जैसे कि पायथन या किसी भी पर्याप्त रूप से सक्षम उपकरण का उपयोग करके नहीं भेजा जा सकता है।