NET实现微信公共平台上传下载多媒体文件(转)

简介:

 举个例子,有人对着我们的公共微信号拍个照片发送过来,然后我们处理这个照片,比如进行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/zhangs1986/p/3636234.html如需转载请自行联系原作者


欢醉

相关文章
|
2月前
|
C++ Windows
.NET Framework安装不成功,下载`NET Framework 3.5`文件,Microsoft Visual C++
.NET Framework常见问题及解决方案汇总,涵盖缺失组件、安装失败、错误代码等,提供多种修复方法,包括全能王DLL修复工具、微软官方运行库及命令行安装等,适用于Windows系统,解决应用程序无法运行问题。
145 3
|
3月前
|
存储 缓存
.NET 6中Startup.cs文件注入本地缓存策略与服务生命周期管理实践:AddTransient, AddScoped, AddSingleton。
记住,选择正确的服务生命周期并妥善管理它们是至关重要的,因为它们直接影响你的应用程序的性能和行为。就像一个成功的建筑工地,工具箱如果整理得当,工具选择和使用得当,工地的整体效率将会大大提高。
126 0
|
6月前
|
存储 移动开发 小程序
校园圈子系统小程序(圈子论坛、私信聊天、资料共享、二手交易、兼职,跑腿)开源码开发/微信公众号、小程序、H5多端账号同步/搭建多城市的综合社交生活平台
基于开源技术栈构建的校园圈子系统小程序,整合社交与生活服务功能,涵盖兴趣圈子、私信聊天、资料共享、二手交易、兼职跑腿等六大核心模块。通过多端账号同步(微信公众号/小程序/H5),实现数据实时交互,满足学生群体的多元化需求。项目精准锚定校园市场,以“社交+服务”双轮驱动,提供一站式解决方案,支持快速部署与多校区运营,同时具备广告、佣金、会员等多元变现能力,是打造校园生态的理想工具。
492 2
校园圈子系统小程序(圈子论坛、私信聊天、资料共享、二手交易、兼职,跑腿)开源码开发/微信公众号、小程序、H5多端账号同步/搭建多城市的综合社交生活平台
|
5月前
|
小程序 Java 关系型数据库
weixin163基于微信小程序的校园二手交易平台系统设计与开发ssm(文档+源码)_kaic
本文介绍了一款基于微信小程序的校园二手物品交易平台的开发与实现。该平台采用Java语言开发服务端,使用MySQL数据库进行数据存储,前端以微信小程序为载体,支持管理员和学生两种角色操作。管理员可管理用户、商品分类及信息、交易记录等,而学生则能注册登录、发布购买商品、参与交流论坛等。系统设计注重交互性和安全性,通过SSM框架优化开发流程,确保高效稳定运行,满足用户便捷交易的需求,推动校园资源共享与循环利用。
|
6月前
|
小程序 Java 关系型数据库
weixin116大学生就业平台微信小程序+ssm(文档+源码)_kaic
本文介绍了一款大学生就业平台微信小程序的开发过程,涵盖开发环境、系统设计、实现与测试等方面。该小程序基于微信平台特性,采用MYSQL数据库存储数据,确保系统稳定与安全,同时满足学生、企业和管理员不同权限用户的功能需求。通过简化操作流程,实现了招聘信息查看、简历投递等实用功能,旨在为用户提供便捷高效的求职体验,符合“操作简单,功能实用”的设计理念。
|
7月前
|
人工智能 安全 机器人
LangBot:无缝集成到QQ、微信等消息平台的AI聊天机器人平台
LangBot 是一个开源的多模态即时聊天机器人平台,支持多种即时通信平台和大语言模型,具备多模态交互、插件扩展和Web管理面板等功能。
1329 14
LangBot:无缝集成到QQ、微信等消息平台的AI聊天机器人平台
|
7月前
|
人工智能 开发框架 机器人
AstrBot:轻松将大模型接入QQ、微信等消息平台,打造多功能AI聊天机器人的开发框架,附详细教程
AstrBot 是一个开源的多平台聊天机器人及开发框架,支持多种大语言模型和消息平台,具备多轮对话、语音转文字等功能。
4199 15
AstrBot:轻松将大模型接入QQ、微信等消息平台,打造多功能AI聊天机器人的开发框架,附详细教程
|
6月前
|
存储 XML 开发工具
【Azure Storage Account】利用App Service作为反向代理, 并使用.NET Storage Account SDK实现上传/下载操作
本文介绍了如何在Azure上使用App Service作为反向代理,以自定义域名访问Storage Account。主要内容包括: 1. **设置反向代理**:通过配置`applicationhost.xdt`和`web.config`文件,启用IIS代理功能并设置重写规则。 2. **验证访问**:测试原生URL和自定义域名的访问效果,确保两者均可正常访问Storage Account。 3. **.NET SDK连接**:使用共享访问签名(SAS URL)初始化BlobServiceClient对象,实现通过自定义域名访问存储服务。
|
9月前
|
Linux C# Windows
.NET使用MiniWord高效生成Word文件
.NET使用MiniWord高效生成Word文件
219 12
|
10月前
Visual Studio 快速分析 .NET Dump 文件
【11月更文挑战第10天】.NET Dump 文件是在 .NET 应用程序崩溃或出现问题时生成的,记录了应用程序的状态,包括内存对象、线程栈和模块信息。通过分析这些文件,开发人员可以定位和解决内存泄漏、死锁等问题。在 Visual Studio 中,可以通过调试工具、内存分析工具和符号加载等功能来详细分析 Dump 文件。此外,还可以使用第三方工具如 WinDbg 进行更深入的分析。
498 1

热门文章

最新文章