#!\urs\bin\env python#encoding:utf-8 #設定編碼方式 from http2 import httpimport urllibdef ReadFileAsContent(filename): #print filename try: with open(filename, 'rb') as f: filecontent = f.read() except Exception, e: print 'The Error Message in ReadFileAsContent(): ' + e.message return '' return filecontentdef get_content_type(filename): import mimetypes return mimetypes.guess_type(filename)[0] or 'application/octet-stream'def isfiledata(p_str): import re r_c = re.compile("^f'(.*)'$") rert = r_c.search(str(p_str)) #rert = re.search("^f'(.*)'$", p_str) if rert: return rert.group(1) else: return None def encode_multipart_formdata(fields): ''' 該函數用於拼接multipart/form-data類型的http請求中body部分的內容 返回拼接好的body內容及Content-Type的頭定義 ''' import random import os BOUNDARY = '----------%s' % ''.join(random.sample('0123456789abcdef', 15)) CRLF = '\r\n' L = [] for (key, value) in fields: filepath = isfiledata(value) if filepath: L.append('--' + BOUNDARY) L.append('Content-Disposition: form-data; name="%s"; filename="%s"' % (key, os.path.basename(filepath))) L.append('Content-Type: %s' % get_content_type(filepath)) L.append('') L.append(ReadFileAsContent(filepath)) else: L.append('--' + BOUNDARY) L.append('Content-Disposition: form-data; name="%s"' % key) L.append('') L.append(value) L.append('--' + BOUNDARY + '--') L.append('') body = CRLF.join(L) content_type = 'multipart/form-data; boundary=%s' % BOUNDARY return content_type, body
其中需要注意的是檔案資料的字典值,其格式為f'/path/to/file',具體調用的形式如下:
form_data = [('gShopID','489'),("addItems", r"f'D:\case3guomei.xml'"), ('validateString', '92c99a2a36f47c6aa2f0019caa0591d2')]form_data_re = encode_multipart_formdata(form_data)print form_data_re
返回的內容是一個元組,第一個參數是要求標頭中Content-Type的值,第二個是具體post的內容。然後使用httplib的post方法就可以發送了。