2009-08-10 11 views
0

httplibを使用して複数パートのフォームを投稿しようとしていますが、urllib2を使用している投稿は機能していますが、Googleのアプリケーションエンジンでホストされています。完全な実例が添付されています。GoogleアプリケーションエンジンへのMultipartフォームのポストは動作しません

私の質問、両者の違いは何かということですなぜ1つの作品ではなく、他の

  1. 私mulipartフォームポストコードに問題がありますか?

  2. Google App Engineに問題がありますか?

  3. などですか?


import httplib 
import urllib2, urllib 

# multipart form post using httplib fails, saying 
# 405, 'Method Not Allowed' 
url = "http://mockpublish.appspot.com/publish/api/revision_screen_create" 
_, host, selector, _, _ = urllib2.urlparse.urlsplit(url) 
print host, selector 
h = httplib.HTTP(host) 

h.putrequest('POST', selector) 

BOUNDARY = '----------THE_FORM_BOUNDARY' 
content_type = 'multipart/form-data; boundary=%s' % BOUNDARY 
h.putheader('content-type', content_type) 
h.putheader('User-Agent', 'Python-urllib/2.5,gzip(gfe)') 
content = "" 
L = [] 
L.append('--' + BOUNDARY) 
L.append('Content-Disposition: form-data; name="test"') 
L.append('') 
L.append("xxx") 
L.append('--' + BOUNDARY + '--') 
L.append('') 
content = '\r\n'.join(L) 
h.putheader('content-length', str(len(content))) 
h.endheaders() 
h.send(content) 

print h.getreply() 

# post using urllib2 works 
data = urllib.urlencode({'test':'xxx'}) 
request = urllib2.Request(url) 
f = urllib2.urlopen(request, data) 
output = f.read() 
print output 

編集:(ニック・ジョンソンの提案に)要求するputrequestを変更したら、それは

url = "http://mockpublish.appspot.com/publish/api/revision_screen_create" 
_, host, selector, _, _ = urllib2.urlparse.urlsplit(url) 

h = httplib.HTTPConnection(host) 

BOUNDARY = '----------THE_FORM_BOUNDARY' 
content_type = 'multipart/form-data; boundary=%s' % BOUNDARY 

content = "" 
L = [] 
L.append('--' + BOUNDARY) 
L.append('Content-Disposition: form-data; name="test"') 
L.append('') 
L.append("xxx") 
L.append('--' + BOUNDARY + '--') 
L.append('') 
content = '\r\n'.join(L) 
h.request('POST', selector, content,{'content-type':content_type}) 
res = h.getresponse() 
print res.status, res.reason, res.read() 

に動作しますので、今の質問は、二つのアプローチと缶との違いは何であるかのまま最初に最初に働かせるのですか?

+2

あなたはdictとしてヘッダーを供給している.putquest()などの代わりに.request()を使ってhttplibでリクエストを送信しようとしましたか? –

+0

実際に私は複数の部分のフォームデータを使ってファイルを送信したがっていますが、これをリクエストで行うことはできますか? –

+0

@ニック作品!、なぜ? –

答えて

0

Nick Johnson's答えは

あなたは.requestを使用してhttplibとのリクエスト(送信しようとしたことがあり)の代わりに().putrequestのなど、辞書などのヘッダを供給?

関連する問題