मैंने अनुरोधों का उपयोग करने के लिए उदाहरण को स्विच किया क्योंकि मेरे पास 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
पर सेट कर सकते हैं।
यदि आप अभी भी कुछ बदलावों को एकीकृत करने के बाद अटक गए हैं तो मुझे बताएं!
'' को mp_parms.append (MultipartParam (नाम में 'name' चर बदल रहा है,' 'छवि [0] 'आदि इसे ठीक? यही कारण है कि वास्तव में fieid कि बहुखण्डीय प्रपत्र फ़ील्ड नाम बनाता है। – drew010
@ drew010 मैं मैंने इस सवाल में कहा कि मैंने कोशिश की है। ऐसा लगता है कि पोस्टर को% xxx में ब्रैकेट बदलता है। –
'urlfetch'is' और '[]' बचने वाले चरित्र में नहीं है। इसलिए मुझे नहीं लगता कि यह कारण है। – obgnaw