【原创】.Net 微信 JS-SDK图片、语音上传接口的实现(MVC)-(二 、上传图片服务器操作)...

上一篇文章,已经介绍过关于微信上传图片的前端JS-SDK , 如果有没看到第一篇的朋友, 可以先看看第一篇

http://www.cnblogs.com/29boke/p/5483599.html

 

好了,现在继续向大家介绍,我们.NET 是如何实现图片上传到自己的服务器的。

 

上次提到, 

function  upload() {
             wx.uploadImage({
                 localId: images.localId[i],
                 success:  function  (res) {
                     i++;
                     //alert('已上传:' + i + '/' + length);
                     images.serverId.push(res.serverId);
                     $( "#img2" ).append( '<img src="' +res.localId+ '"  style="width:50px; height:50px;"/ /> <br />' );
                     downloadImage(res.serverId);
                     if  (i < length) {
                         upload();
                     }
                 },
                 fail:  function  (res) {
                     alert(JSON.stringify(res));
                 }
             });
         }
 
上传成功后, 会有一个serverId返回 ,  这个serverId 就是上传到微信服务器上, 返回在服务上的ID , 然后通过请求微信临时的素材,  请求接口,返回得到素材流
获取临时素材
公众号可以使用本接口获取临时素材(即下载临时的多媒体文件)。请注意,视频文件不支持https下载,调用该接口需http协议。
本接口即为原“下载多媒体文件”接口。
接口调用请求说明
http请求方式: GET,https调用
https://api.weixin.qq.com/cgi-bin/media/get?access_token=ACCESS_TOKEN&media_id=MEDIA_ID
请求示例(示例为通过curl命令获取多媒体文件)
curl -I -G "https://api.weixin.qq.com/cgi-bin/media/get?access_token=ACCESS_TOKEN&media_id=MEDIA_ID"
参数说明
参数    是否必须    说明
access_token    是    调用接口凭证
media_id    是    媒体文件ID
返回说明
正确情况下的返回HTTP头如下:
HTTP/1.1 200 OK
Connection: close
Content-Type: image/jpeg 
Content-disposition: attachment; filename="MEDIA_ID.jpg"
Date: Sun, 06 Jan 2013 10:20:18 GMT
Cache-Control: no-cache, must-revalidate
Content-Length: 339721
curl -G "https://api.weixin.qq.com/cgi-bin/media/get?access_token=ACCESS_TOKEN&media_id=MEDIA_ID"
错误情况下的返回JSON数据包示例如下(示例为无效媒体ID错误):
{"errcode":40007,"errmsg":"invalid media_id"}

 

详情可以参考, 官方的的JS-SDK ,  下面看我是如何实现的。

当我们需要保存的时候, 用异步请求, Ajax , 然后请求到方法, 带上参数, ServerID 

//获取临时素材
        //https://api.weixin.qq.com/cgi-bin/media/get?access_token=ACCESS_TOKEN&media_id=MEDIA_ID 

        //微信下载图片
        public async Task<ActionResult> WeixinDownloadImage(string mediaId)
        {
            var token = WeixinConfig.TokenHelper.GetToken();//基础支持中的access_token
            var client = new HttpClient();
            var response = await client.GetAsync(string.Format("https://api.weixin.qq.com/cgi-bin/media/get?access_token={0}&media_id={1}", token, mediaId));
            var stream = await response.Content.ReadAsStreamAsync();
            Bitmap bitmap = new Bitmap(stream);
            string basePath = "/UploadPic/";
            string filename = DateTime.Now.Ticks + ".jpg";
            bitmap.Save(Server.MapPath(basePath) + filename);

            //返回地址
            string path = ConfigurationManager.AppSettings["Domain"].ToString();
            return Json(new { Link = path + basePath + filename }, JsonRequestBehavior.AllowGet);
        }

 

这种是MVC的, 首先是得到Token了, 然后建立请求, httpclient ,  

然后再用流来响应 ,

再通过.NET里面的Draying里的一个图片流处理, BitMap 实现对图片流的操作, BitMap 里面已经封装好了Save 的方法, 只需要把服务器上的地址, 文件名, 都带上, 就可以直接保存到服务器 。 

 

下面介绍第二种, 第二种是临时的素材, 保存三天, 用于特殊需求的,临时显示的素材, 因为是保存在微信端, 所以, 只能够用三天

我们可以先把上传得到的返回serverid , 保存到数据库当中, 读取出来的时候, 

 在前端调用一下

wx.downloadImage ({
serverId: record.serverId,
isShowProgressTips: 1,
success: function (res) {
record.localId = res.localId;
});

返回得到的localId 就是缓存了微信, 

然后把 localId 放到一个<image src=""/>  src 里面, 就可以直接看到图片了。

当然,这种做法, 是无法通过预览接口来看的, 有兴趣的朋友, 可以尝试下 直接用接口放在 src 里面, 看能否显示出来。 

 

今天就到这里了, 下一篇把语音的功能, 也一并带给大家, 感谢大家的收看 。 

 

 

转载于:https://www.cnblogs.com/29boke/p/5503405.html

Entities/Request*.cs 用于接收微信平台自动发送到服务器的实体(发送过来的是XML),包括文本、位置、图片三类 Entities/Response*.cs 用于反馈给发送人的信息实体(最终会转成XML),包括文本、新闻(图文)两类 Helpers/EntityHelper.cs 用于实体和XML之间的转换(由于其中有许多需要特殊处理的字段和类型,这里不能简单用XML序列化) Helpers/MsgTypeHelper.cs 用于获取消息类型 CheckSignature.cs 验证请求合法性类 Enums.cs 各种枚举 RequestMessageFactory.cs 用于自动生成不同Request类型的实体,并作必要的数据填充 Senparc.Weixin.MP几个关键类及重要方法(按一般使用过程排序) 生成验证字符串:Senparc.Weixin.MP.CheckSignature.GetSignature(string timestamp, string nonce, string token = null),返回根据微信平台提供的数据,SHA1加密后的验证字符串(注意token必须跟公众平台的设置一直) 验证请求:Senparc.Weixin.MP.CheckSignature.Check(string signature, string timestamp, string nonce, string token = null),验证请求是否合法 获取请求实体:var requestMessage = Senparc.Weixin.MP.RequestMessageFactory.GetRequestEntity(XDocument doc); 根据不同请求的类型,自动生成可用于操作的实体(doc只需要用XDocument.Parse(xmlString)就能生成),requestMessage.MsgType就是请求枚举类型。 进行判断及各类操作。 根据需要,创建响应类型的实体,如:var responseMessage = ResponseMessageBase.CreateFromRequestMessage(requestMessage, ResponseMsgType.Text) as ResponseMessageText; 即可返回文本类型信息。 由于目前微信只接受XML的返回数据,所以在返回之前还需要做一次转换:XDocument responseDoc = Senparc.Weixin.MP.Helpers.EntityHelper.ConvertEntityToXml(responseMessage); var xmlString =responseDoc.ToString(); 至此整个微信公众账号的自动响应过程结束。 下面可以直接下载源代码及示例(示例是ASP.NET MVC 4,.NET 4.0,为了提高兼容性,Senparc.Weixin.MP源代码使用.NET 3.5): 压缩包中包含三个文件夹:Senparc.Weixin.MP、Senparc.Weixin.MP.BuildOutPut、Senparc.Weixin.MP.Sample,分别对应Senparc.Weixin.MP.dll源代码项目、Senparc.Weixin.MP.dll输出目录、Web示例,Web示例建议放到公网测试,让公众平台自动发送
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值