2011-02-04 62 views
3

我想通過python將文件發佈到服務器,爲此我需要將此文件命名爲「xmlfile」,以便服務器識別輸入。python urllib2文件發送問題

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將POST表單數據與Python]可能重複(http://stackoverflow.com/questions/680305/using-multipartposthandler-to-post-form-data-with-python) – 2011-02-04 09:58:48

回答

1

我剛纔讀的問題nimrodm簡稱。一個答案提到海報模塊。 該模塊可以執行multipart/form-data編碼,因此如果向您的項目添加其他依賴項不是問題,我會使用海報模塊。


這不是應該的那樣簡單。有一個代碼片段在我用於我的代碼的網絡中浮動,它的確有用。您可能需要根據自己的需求進行調整。

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或直接在代碼它references

urllib通常使用application/x-www-form-urlencoded內容類型發送數據,而您需要multipart/form-data。引用的庫根據需要對數據進行編碼。