2017-06-28 17 views
6

मैं निम्नलिखित कर्ल अनुरोध को दोहराने के लिए कोशिश कर रहा हूँ:पोस्टर के साथ सरणी तत्व के रूप में फ़ाइल कैसे अपलोड करें?

poster उपयोग के साथ
curl -i -k -H "Content-Type: multipart/form-data" \ 
    -F "method=uploadphoto" \ 
    -F "version=1.2.3" \ 
    -F "format=json" \ 
    -F "image[0][email protected]/Users/user/Downloads/file.jpeg" \ 
    https://example.com/api 

:

from poster.encode import multipart_encode, MultipartParam 

file_content = open('/Users/user/Downloads/file.jpeg', 'rb') 
url = 'https://example.com/api' 
headers = { 
    'Content-Type': 'multipart/form-data' 
} 
parms = { 
    'method': 'uploadphoto', 
    'version': '1.2.3', 
    'format': 'json' 
} 
mp_parms = [] 
for name, value in parms.items(): 
    mp_parms.append(MultipartParam(name, value, filetype='text/plain')) 
file_photo = MultipartParam('image', file_content, 'file.jpeg', 'application/image') 
mp_parms.append(file_photo) 
parameters, headers = multipart_encode(mp_parms) 
response = urlfetch.Fetch(url, payload=''.join(parameters), headers=headers, method=urlfetch.POST, deadline=60) 

लेकिन लग रहा है image क्षेत्र की तरह एक क्षेत्र है, जब सरणी पारित किया जाना चाहिए के रूप में पारित कर दिया है। नाम के रूप में image[0] का उपयोग मदद नहीं करता है।

मैं इसे कैसे ठीक कर सकता हूं?

+0

'' को mp_parms.append (MultipartParam (नाम में 'name' चर बदल रहा है,' 'छवि [0] 'आदि इसे ठीक? यही कारण है कि वास्तव में fieid कि बहुखण्डीय प्रपत्र फ़ील्ड नाम बनाता है। – drew010

+0

@ drew010 मैं मैंने इस सवाल में कहा कि मैंने कोशिश की है। ऐसा लगता है कि पोस्टर को% xxx में ब्रैकेट बदलता है। –

+0

'urlfetch'is' और '[]' बचने वाले चरित्र में नहीं है। इसलिए मुझे नहीं लगता कि यह कारण है। – obgnaw

उत्तर

5

मैंने अनुरोधों का उपयोग करने के लिए उदाहरण को स्विच किया क्योंकि मेरे पास Google App SDK इंस्टॉल नहीं है लेकिन नीचे कोड काम करता है।

एक महत्वपूर्ण परिवर्तन image से image[] को बदलने के लिए बदल रहा था ताकि रिमोट एंड एक ही नाम के साथ कई इनपुट पहचान सके। सुनिश्चित नहीं है कि यह urlfetch के साथ लागू होगा लेकिन कच्चे पोस्ट बॉडी के बाद मुझे अतिरिक्त \r\n जोड़ना पड़ा।

चित्रण और परीक्षण के लिए, मैंने इसे दूसरी छवि अपलोड की थी।

पहले, कोड:

from poster.encode import multipart_encode, MultipartParam 
import requests 
from pprint import pprint 

file_content = open('/home/me/Pictures/admin.jpg', 'rb').read() 
file_content2 = open('/home/me/Pictures/ed.jpeg', 'rb').read() 
url = 'http://localhost/test.php' 
parms = { 
    'method': 'uploadphoto', 
    'version': '1.2.3', 
    'format': 'json' 
} 
mp_parms = [] 
for name, value in parms.items(): 
    mp_parms.append(MultipartParam(name, value, filetype='text/plain')) 

file_photo = MultipartParam('image[]', file_content, 'file.jpeg', 'image/jpg') 
mp_parms.append(file_photo) 

file_photo = MultipartParam('image[]', file_content2, 'test.jpeg', 'image/jpg') 
mp_parms.append(file_photo) 

parameters, headers = multipart_encode(mp_parms) 

pprint(headers) 

#response = urlfetch.Fetch(url, payload=''.join(parameters), headers=headers, method=urlfetch.POST, deadline=60) 

r = requests.post(url, data=''.join(parameters) + "\r\n", headers=headers) 

print r.text 

test.php स्क्रिप्ट यह पदों होता है और पता चलता उत्पादन की तरह करने के लिए:

// The post data: 
array(3) { 
    ["version"]=> 
    string(5) "1.2.3" 
    ["method"]=> 
    string(11) "uploadphoto" 
    ["format"]=> 
    string(4) "json" 
} 

// The uploaded files (both of them as expected): 
array(1) { 
    ["image"]=> 
    array(5) { 
    ["name"]=> 
    array(2) { 
     [0]=> 
     string(9) "file.jpeg" 
     [1]=> 
     string(9) "test.jpeg" 
    } 
    ["type"]=> 
    array(2) { 
     [0]=> 
     string(9) "image/jpg" 
     [1]=> 
     string(9) "image/jpg" 
    } 
    ["tmp_name"]=> 
    array(2) { 
     [0]=> 
     string(14) "/tmp/phpnbpGGx" 
     [1]=> 
     string(14) "/tmp/php7TVcyL" 
    } 
    ["error"]=> 
    array(2) { 
     [0]=> 
     int(0) 
     [1]=> 
     int(0) 
    } 
    ["size"]=> 
    array(2) { 
     [0]=> 
     int(71066) 
     [1]=> 
     int(30450) 
    } 
    } 
} 

# some server vars: 
["CONTENT_LENGTH"]=> 
    string(6) "102186" 
["CONTENT_TYPE"]=> 
    string(62) "multipart/form-data; boundary=73772149e2ef4a5daf9b5eb18a5d73f5" 

यह निम्न पोस्ट उत्पादन के रूप में Wireshark में पकड़ा:

POST /test.php HTTP/1.1 
Host: localhost 
Connection: keep-alive 
Accept-Encoding: gzip, deflate 
Accept: */* 
User-Agent: python-requests/2.12.1 
Content-Length: 102186 
Content-Type: multipart/form-data; boundary=176473ffab3146b5bfffc6185ad9474a 

--176473ffab3146b5bfffc6185ad9474a 
Content-Disposition: form-data; name="version" 
Content-Type: text/plain 

1.2.3 
--176473ffab3146b5bfffc6185ad9474a 
Content-Disposition: form-data; name="method" 
Content-Type: text/plain 

uploadphoto 
--176473ffab3146b5bfffc6185ad9474a 
Content-Disposition: form-data; name="format" 
Content-Type: text/plain 

json 
--176473ffab3146b5bfffc6185ad9474a 
Content-Disposition: form-data; name="image[]"; filename="file.jpeg" 
Content-Type: image/jpg 

......JFIF.....H.H.....C................................... 
...snip... 
..K5{......1....fh........k..n... 
--176473ffab3146b5bfffc6185ad9474a 
Content-Disposition: form-data; name="image[]"; filename="test.jpeg" 
Content-Type: image/jpg 

......JFIF.............;CREATOR: gd-jpeg v1.0 (using IJG JPEG v80), quality = 90 
...snip... 
6.......~.h.j......}29..b~.h.).2.!E..tU.........L....d...lv..+....f)Y... 
--176473ffab3146b5bfffc6185ad9474a-- 

HTTP/1.1 200 OK 

मुझे आशा है कि इससे मदद मिलेगी। मुझे यकीन नहीं है कि एपीआई परवाह करेगा, लेकिन हो सकता है कि आप छवि डेटा को बेसकोड करना चाहते हैं और पोस्ट से कच्चे बाइनरी को रखने के लिए सामग्री-एन्कोडिंग को base64 पर सेट कर सकते हैं।

यदि आप अभी भी कुछ बदलावों को एकीकृत करने के बाद अटक गए हैं तो मुझे बताएं!

+0

धन्यवाद। 'अनुरोधों' के लिए कई निर्भरताओं की मैन्युअल स्थापना की आवश्यकता होती है, जीएई को पुराने संस्करण 2.3.0 की आवश्यकता होती है (अन्यथा यह सामग्री की लंबाई के पूर्णांक मान के साथ काम नहीं करता है और अंतर्निहित एसएसएल लाइब्रेरी के साथ), लेकिन मैंने इसे ठीक करने में कामयाब रहा और मेरी जांच करने की कोशिश की 'अनुरोध' के साथ कोड। लेकिन परिणाम 'urlfetch' जैसा ही है। ऐसा लगता है कि समस्या फ़ील्ड नाम के साथ है। 'image []' को 'image% 5B% 5D' में एन्कोड किया गया है और ऐसा लगता है कि तृतीय पक्ष सर्वर इसे पहचानने में सक्षम नहीं है (जब आपका PHP सर्वर करता है)। –

+0

यह अजीब बात है कि आपको फील्ड नाम पर एन्कोडिंग का सामना करना पड़ेगा जहां मेरा वायरशर्क कच्चा कैप्चर इसे शाब्दिक 'छवि [] 'के रूप में दिखाता है। क्या आप एक कैप्चर करने में सक्षम हैं या https पर एपीआई है? – drew010

+0

आपकी मदद के लिए धन्यवाद। समस्या पोस्टर मॉड्यूल के पुराने संस्करण के साथ था;)। –

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

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