2011-02-04 13 views
3

私はpython経由でサーバーにファイルを投稿したいのですが、これはサーバーが入力を認識できるようにこのファイルの名前を "xmlfile"とする必要があります。python urllib2 file問題を送信する

import urllib2 

url = "http://somedomain" 
to_send = open('test.xml').read() 
data = {} 
data['xmlfile'] = to_send 
f = urllib2.urlopen(url, data) 

これは機能しません。また、どのように応答を取得して保存することができますか?言い換えれば

、私はカールと同じように行動をしたい:

curl.exe http://somedomain -F [email protected] -o response.html 
+0

[MultipartPostHandlerを使用してPythonでフォームデータをPOSTする]の複製が可能です(http://stackoverflow.com/questions/680305/using-multipartposthandler-to-post-form-data-with-python) –

答えて

1

私は質問nimrodmを読んで言及しました。 1つの答えは、ポスターモジュールです。 このモジュールはmultipart/form-dataエンコーディングを行うことができます。したがって、プロジェクトに別の依存関係を追加することに問題がない場合は、私はポスターモジュールを使用します。


これはそう簡単ではありません。私は自分のコードのために使用したネットの周りに浮かんでいるコードスニペットがあり、それはトリックを行います。おそらくあなたのニーズに合わせてそれを適応させる必要があります。コードそれreferences

class RequestWithMethod(urllib2.Request): 
    def __init__(self, method, *args, **kwargs): 
     self._method = method 
     urllib2.Request.__init__(self, *args, **kwargs) 

    def get_method(self): 
     return self._method 

class RestRequest(object): 
    def __init__(self, base_url): 
     self.base_url = base_url 

    def request(self, url, method, headers={"Accept" : "application/json"}, data=None, json_response=True): 
     request = RequestWithMethod(url='{0}{1}{2}'.format(self.base_url, root_url(), url), 
            method=method, 
            headers=headers) 

     if data != None: 
      data = urllib.urlencode(data) 

     response = urllib2.urlopen(request, data=data).read() 

     if json_response: 
      return from_json(response) 
     else: 
      return response 

    def GET(self, url, **kwargs): 
     return self.request(url, 'GET', **kwargs) 

    def POST(self, url, **kwargs): 
     return self.request(url, 'POST', **kwargs) 

    def POST_FILE(self, url, file, headers={"Accept" : "application/json"}, data={}, **kwargs): 
     content_type, body = encode_multipart_formdata(data, file) 

     headers['Content-type'] = content_type 
     headers['Content-length'] = str(len(body)) 

     request = RequestWithMethod(url='{0}{1}{2}'.format(self.base_url, root_url(), url), 
            data=body, 
            method='POST', 
            headers=headers) 

     return from_json(urllib2.urlopen(request).read()) 

    def PUT(self, url, **kwargs): 
     return self.request(url, 'PUT', **kwargs) 

    def DELETE(self, url, **kwargs): 
     return self.request(url, 'DELETE', **kwargs) 

def encode_multipart_formdata(data, file): 
    boundary = '----------ThIs_Is_tHe_bouNdaRY_$' 
    L = [] 
    for key, value in data.items(): 
     L.append('--' + boundary) 
     L.append('Content-Disposition: form-data; name="{0}"'.format(key)) 
     L.append('') 
     L.append(value) 

    key, filename, value = file 
    L.append('--' + boundary) 
    L.append('Content-Disposition: form-data; name="{0}"; filename="{1}"'.format(key, filename)) 
    content_type = mimetypes.guess_type(filename)[0] or 'application/octet-stream' 
    L.append('Content-Type: {0}'.format(content_type)) 
    L.append('') 
    L.append(value) 

    L.append('--' + boundary + '--') 
    L.append('') 
    body = '\r\n'.join(L) 
    content_type = 'multipart/form-data; boundary={0}'.format(boundary) 

    return content_type, body 
0

ルックat this stackoverflow questionまたは直接。

urllibは通常application/x-www-form-urlencodedコンテンツタイプを使用し、multipart/form-dataが必要なときにデータを送信します。参照されるライブラリは、必要に応じてデータをエンコードします。

関連する問題