知识点

相关文章

更多

最近更新

更多

微信公共服务平台开发(.Net 的实现)8-------处理图片(上传下载发送)

2019-03-02 00:59|来源: 网路

举个例子,有人对着我们的公共微信号拍个照片发送过来,然后我们处理这个照片,比如进行ocr识别字(随后就会降到这个例子),或者人脸识别,或者拍照取证等,这些功能都是相当有用的。那么我们现在就要分析一下这个过程。微信平台肯定不能帮助我们OCR或者人脸识别等功能,要做这些功能首先到得到图片!用户拍摄的照片首先被上传到了wenxin的服务器,然后就有了一个mediaID,我们用这个mediaID可以下载到我们自己的服务器上然后处理,把结果给微信平台,由微信平台最终反馈给用户(关注者)。微信的开发文档已经给出了下载资源的办法,我改造为.net的,如下:

 

 

/// <summary>
/// 下载保存多媒体文件,返回多媒体保存路径
/// </summary>
/// <param name="ACCESS_TOKEN"></param>
/// <param name="MEDIA_ID"></param>
/// <returns></returns>
public string GetMultimedia(string ACCESS_TOKEN, string MEDIA_ID)
{
string file = string.Empty;
string content = string.Empty;
string strpath = string.Empty;
string savepath = string.Empty;
string stUrl = "http://file.api.weixin.qq.com/cgi-bin/media/get?access_token=" + ACCESS_TOKEN + "&media_id=" + MEDIA_ID;

HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(stUrl);

req.Method = "GET";
using (WebResponse wr = req.GetResponse())
{
HttpWebResponse myResponse = (HttpWebResponse)req.GetResponse();

strpath = myResponse.ResponseUri.ToString();
WriteLog("接收类别://" + myResponse.ContentType);
WebClient mywebclient = new WebClient();
savepath = Server.MapPath("image") + "\\" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + (new Random()).Next().ToString().Substring(0, 4) + ".jpg";
WriteLog("路径://" + savepath);
try
{
mywebclient.DownloadFile(strpath, savepath);
file = savepath;
}
catch (Exception ex)
{
savepath = ex.ToString();
}

}
return file;
}

 

上面的两个参数很好理解,第一就是ACCESS_TOKEN,之前说过很多了,第二就是在微信服务器上的资源id,即mediaID。如果我们要下载微信服务器上的资源总要知道id吧。但是MEDIA_ID又是怎么产生的呢?我首先改造一下之前的消息实体类,加入MediaId 属性

class wxmessage
{
public string FromUserName { get; set; }
public string ToUserName { get; set; }
public string MsgType { get; set; }
public string EventName { get; set; }
public string Content { get; set; }
public string Recognition { get; set; }
public string MediaId { get; set; }
public string EventKey { get; set; }
}

然后改造一下GetWxMessage(),给MediaId赋值。

private wxmessage GetWxMessage()
{
wxmessage wx = new wxmessage();
StreamReader str = new StreamReader(Request.InputStream, System.Text.Encoding.UTF8);
XmlDocument xml = new XmlDocument();
xml.Load(str);
wx.ToUserName = xml.SelectSingleNode("xml").SelectSingleNode("ToUserName").InnerText;
wx.FromUserName = xml.SelectSingleNode("xml").SelectSingleNode("FromUserName").InnerText;
wx.MsgType = xml.SelectSingleNode("xml").SelectSingleNode("MsgType").InnerText;
if (wx.MsgType.Trim() == "text")
{
wx.Content = xml.SelectSingleNode("xml").SelectSingleNode("Content").InnerText;
}
if (wx.MsgType.Trim() == "event")
{
wx.EventName = xml.SelectSingleNode("xml").SelectSingleNode("Event").InnerText;
wx.EventKey = xml.SelectSingleNode("xml").SelectSingleNode("EventKey").InnerText;
}
if (wx.MsgType.Trim() == "voice")
{
wx.Recognition = xml.SelectSingleNode("xml").SelectSingleNode("Recognition").InnerText;
}
if (wx.MsgType.Trim() == "image")
{
wx.MediaId = xml.SelectSingleNode("xml").SelectSingleNode("MediaId").InnerText;
}

return wx;
}

如果我们在修改一下消息接受的代码,就可以做到,客户发一个照片给微信平台,程序检测到时图片,然后根据MediaId,调用GetMultimedia方法把图片下载到自己的服务器上。后面的工作嘛,你就想干什么干什么了。
刚才的例子好像是用户(关注者),发图片,然后通过微信平台到我们的服务器中,还有一种情况,用户发一个用户名:例如“hemeng”,然后我需要调用已经存在服务器中的hemeng头像的图片反馈给用户,这怎么办呢?如何把我们的图片传给微信平台,然后传给用户呢?我们就用到了上传得方法:

/// <summary>
/// 上传多媒体文件,返回 MediaId
/// </summary>
/// <param name="ACCESS_TOKEN"></param>
/// <param name="Type"></param>
/// <returns></returns>
public string UploadMultimedia(string ACCESS_TOKEN, string Type)
{
string result = "";
string wxurl = "http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token=" + ACCESS_TOKEN + "&type=" + Type;
string filepath = Server.MapPath("image") + "\\hemeng80.jpg";(本地服务器的地址)
WriteLog("上传路径:" + filepath);
WebClient myWebClient = new WebClient();
myWebClient.Credentials = CredentialCache.DefaultCredentials;
try
{
byte[] responseArray = myWebClient.UploadFile(wxurl, "POST", filepath);
result = System.Text.Encoding.Default.GetString(responseArray, 0, responseArray.Length);
WriteLog("上传result:" + result);
UploadMM _mode = JsonHelper.ParseFromJson<UploadMM>(result);
result = _mode.media_id;
}
catch (Exception ex)
{
result = "Error:" + ex.Message;
}
WriteLog("上传MediaId:" + result);
return result;
}

第二个参数如果是图片"image",可以参照微信的文档。函数的返回值就是一个MediaId,这样你就可以利用发送图片的函数,发给客户了,发送图片的函数如下:

protected string sendPicTextMessage(Msg _mode, string MediaId)
{
string res = string.Format(@"<xml>
<ToUserName><![CDATA[{0}]]></ToUserName>
<FromUserName><![CDATA[{1}]]></FromUserName>
<CreateTime>{2}</CreateTime>
<MsgType><![CDATA[image]]></MsgType>
<Image>
<MediaId><![CDATA[{3}]]></MediaId>
</Image>
</xml> ",
_mode.FromUserName, _mode.ToUserName, DateTime.Now, MediaId);

return res;
}

其他视频,语音的操作也类似,就不再冗余介绍了。有了这些知识我们是不是能做不少应用了?当然是肯定的,但是我们的代码还不够优化,结构也不合理,不着急,我们会逐渐介绍到的,因为我们还没有完全了解完微信的强大功能。

 


转自:http://www.cnblogs.com/lyl6796910/p/3661139

相关问答

更多
  • 看下柳峰的java微信开发博客吧http://blog.csdn.net/lyq8479/article/details/8944988 http://blog.csdn.net/lyq8479/article/category/1366622/2
  • 说实话 从软件或代码角度 没辙 都是长连接 逃不掉的 只能从系统设计上去考虑,大致上会有以下这两种思路(基本上是都用的): 1、对于所有的上传的文件,根据随机生成的名称或code取hash用策略取模,分服务器存/取文件,保证不触及io瓶颈,内部文件同步策略自己考虑 2、对所有请求,分pop点分发,根据用户的物理地址选择相应较近的pop点处理请求(当前pop请求已满则顺延至下一pop点,依次类推)
  • 最关键的一点是设置Http请求头,注意后面有一个“-”,不要落下。 httpget.addHeader("RANGE", "bytes=" + offset + "-");
  • commons-fileupload结合commons-io组件可以实现大文件上传,多文件上传,断点续传功能 至于显示进度条就需要JS的配合了, 单线程多线程,java本身就能提供这功能 至于独立与系统之外的服务,那就多添加一个服务模块好了
  • 安装vsftpd这个程序.然后文本编辑器打开/etc/vsftpd.conf这个配置文件. 修改以下几行 #Local_enble=yes #Write_enable=no 为 Local_enble=yes Write_enable=yes 重启vsftpd服务就可以用本地用户上传了
  • 主目录没有写权限, 可以 chmod 0777 /var/lib/tftpboot 2.Error code 1: File not found 在/etc/xinetd.d/tftp配置文件中,server_args后加上 -c 选项,方可上传 service tftp{socket_type = dgram protocol = udp wait = yes user = root server = /usr/sbin/in.tftpd server_args = -s /var/lib/tftpboo ...
  • 通常人们在架设FTP服务器时都为认为微软的IIS设置繁杂 ,其次是安全性较差。所以在这里将介绍使用功能强大的Serv-U来架设FTP服务器的过程 。Serv-U是一个非常实用的FTP服务器工具,体积虽然小但是大多数网站都是用该程序, 并且是共享软件,可以到软件类网站下载。 Serv-U的特征 1.支持多种用户接入 2.支持匿名用户,可随时限制用户数。 3.安全选项多 3.可基于目录或文件实现安全管理 4.支持虚拟多主目录IP站点登录 5.比例和带宽限制 6.作为系统服务运行 7.远程实施项目 8.通过FTP ...
  • 这个需要服务器配合的。比如,你一开始就获取服务器的目录结构,当你需要上传时把你获取的结构展开,选择某个后把你所选的目录信息与文件一起传到服务器。如果是http方式,你可以把目录信息附加到头信息里嘛,如果是socket,那你定个简单的协议嘛。
  • 先安装JDK和JRE;然后Cygwin;再开启SSHD服务,之后便可以配置搭建Hadoop云平台。在云平台搭建好之后,安装Eclipse,并将Hadoop-eclipse开发插件包嵌入Eclipse。此后便可以通过eclipse连接Hadoop云平台,并实现其上的二次开发。具体的文件上传与下载都可以通过HDFS提供的API实现。
  • 各个行业都有的。可以看下小猪CMS,,you shiyong