新浪は写真付きの微博「multiiprt/form-data形式でファイルをアップロードする」を発表しました.


新浪微博のAPIを使って写真付きの微博を更新するには、multiipad/form-dataスタイルのPOSTが必要です.
このRFCを参照することができます. http://www.ietf.org/rfc/rfc1867.txt
requestヘッドにConttent-typeをセットする必要があります.
Conttet-type=multiad/form-data;boundary=xxxx
そのうち boundary=xxxxは重要です.requestのbodyにセパレータを作成するための標識です.
これはhttpfoxを使って切り取られたrequestのbody部分、すなわちpostのデータ部分です.
--xxxx
Content-Disposition: form-data; name="status"

111
--xxxx
Content-Disposition: form-data; name="pic"; filename="shell.png"
Content-Type: image/png

    
--xxxx--
xxxxの前に二つを加えます.
xxxxの前後に二つを加えてください.
なお、改行は「\r」であり、正式な内容と説明の間には空行があります.
以下はpythonを使って画像をアップロードするミニブログです.
def requestMultiPart(self,URI,params):
		'''
			params =[{'name':'pic','filename':'shell.png','type':'image/png','data':'xxx'},...]
			
			if 'error' in return dict,thus the request was failed!
		'''
		if self.user_token==None or self.user_secret==None:
			return False,'token or secret is None' 
		header = [
        ('oauth_consumer_key', self.APP_KEY),
        ('oauth_nonce', uuid.uuid4().hex),
        ('oauth_signature_method', 'HMAC-SHA1'),
        ('oauth_timestamp', int(time.time())),
        ('oauth_version', '1.0'),
        ('oauth_token',self.user_token)
    	]
		header2 = header[:]
		header2.sort()
		p = 'POST&%s&%s' % (quote(URI, safe=''), quote(urlencode(header2)))
		signature = hmac.new(self.APP_SECRET + '&' + self.user_secret, p, hashlib.sha1).digest().encode('base64').rstrip()
		header.append(('oauth_signature', quote(signature)))
		header = ', '.join(['%s="%s"' % (k, v) for (k, v) in header])
		header = {'Authorization': 'OAuth realm="", %s' % header}
		header['Content-type'] ='multipart/form-data; boundary=huohua'
		
		data = ''
		for param in params:
			data += '--huohua\r
' data += 'Content-Disposition: form-data; name="%s"; '%param['name'] if 'filename' in param: data += 'filename="%s"'%param['filename'] if 'type' in param: data += '\r
Content-Type: %s'%param['type'] data +='\r
\r
' data += param['data'] data +='\r
' data += '--huohua--' print data try: request = urllib2.Request(URI,data=data, headers=header) result = urllib2.urlopen(request).read().decode('utf-8') result = json.loads(result) except urllib2.HTTPError,e: result = {'error':str(e.code)+' ' + e.msg} except: result = {'error':'get respose from sina error: request error |'+traceback.format_exc()} return result
def statuses_upload(self,status,imgpath):
		'''
		upload image and update statuses
		'''
		if not os.path.exists(imgpath):
			return {'error':'image file not exist!'}
		filename = os.path.basename(imgpath)
		type = filename.split('.')[-1]
		f = open(imgpath,'rb')
		pic = f.read()
		print len(pic)
		f.close()
		requst = self.sinaRequest.requestMultiPart('http://api.t.sina.com.cn/statuses/upload.json',\
				[{'name':'status','data':status},{'name':'pic','filename':filename,'type':'image/'+type,'data':pic}])
		
		return requst