# 如何下载微信公众号接收用户发送的消息中的图片

在前一篇文章已经知道,接收消息是XML格式

xml图片消息格式

Msgtype有几种类型 文本消息 图片消息 语音消息 视频消息 小视频消息 地理位置消息 (可以用来打卡) 链接消息

点击这里查看微信文档 (opens new window)

我们再看这里图片消息xml中的picurl,mediaid部分

<PicUrl><![CDATA[this is a url]]></PicUrl>
<MediaId><![CDATA[media_id]]></MediaId>
1
2

那下载这个图片就有两个方法了 1 使用picurl来下载 2 根据MediaId用微信临时素材接口下载

# 方法一:使用picurl来下载

cUrl=this.getkeyvalue(MsgText,"PicUrl")		     
Qiyu_HttpClient =Newobject("Qiyu_HttpClient","Qiyu_HttpClient.prg")				
Qiyu_HttpClient.DataType="bin"    &&数据类型 string 字符串  bin 二进制流				
cReturn= Qiyu_HttpClient.Send(cUrl)
If Isnull(cReturn)
	?Qiyu_HttpClient.msg
Else
	STRTOFILE(cReturn,SYS(2015)+".jpg")
Endif
1
2
3
4
5
6
7
8
9

# 方法二 根据MediaId 获取

我已经将调用api封装成类库了。

cMediaId=This.getkeyvalue(MsgText,"MediaId")
oMedia=This.getMedia(cMediaId)  &&返回对象
IF ISNULL(oMedia)
   ERROR this.msg
ENDIF 
?"文件名",oMedia.filename
Strtofile(oMedia.filedata,oMedia.filename)  &&多媒体数据
1
2
3
4
5
6
7

以上两个方法有什么区别,一个是压缩过的图,一个是原图。

附两个过程,大家没有框架的,可以按这个思路去实现。有框架的当然就直接用啦。

getkeyvalue过程方法

	Procedure getkeyvalue
		Lparameters cMsgText,cKey
		If Pcount()<2
			Error "必须传入两个参数"
		Endif

		Set Textmerge Delimiters To "{" , "}"
		TEXT TO leftchar NOSHOW TEXTMERGE PRETEXT 1+2
	    <{cKey}><![CDATA[
		ENDTEXT
		TEXT TO rightchar NOSHOW TEXTMERGE PRETEXT 1+2
	    ]]></{cKey}>
		ENDTEXT
		Set Textmerge Delimiters
		Return Strextract(cMsgText ,leftchar,rightchar,1,1)
	Endproc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

getMedia过程方法

*--获取媒体资源,返回对象(filename 文件名,filedata文件数据)
	Procedure getMedia
		Lparameters cMEDIA_ID
		Local cUrl,lcResult,oFly
		TEXT TO curl NOSHOW TEXTMERGE PRETEXT 1+2+4+8
		https://api.weixin.qq.com/cgi-bin/media/get?access_token=<<this.token>>&media_id=<<cMEDIA_ID>>
		ENDTEXT

		Qiyu_HttpClient =Newobject("Qiyu_HttpClient","Qiyu_HttpClient.prg")
		Qiyu_HttpClient.DataType="bin"    &&数据类型 string 字符串  bin 二进制流
		lcResult= Qiyu_HttpClient.Send(cUrl)
		If Isnull(lcResult)
			This.msg=Qiyu_HttpClient.msg
			Return .Null.
		Endif

		oFly=Createobject("empty")
		AddProperty(oFly,"filename",Qiyu_HttpClient.filename)
		AddProperty(oFly,"filedata",lcResult)

		Return oFly
	Endproc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22