上一篇文章,已经介绍过关于微信上传图片的前端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));
}
});
}
获取临时素材 公众号可以使用本接口获取临时素材(即下载临时的多媒体文件)。请注意,视频文件不支持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 里面, 看能否显示出来。
今天就到这里了, 下一篇把语音的功能, 也一并带给大家, 感谢大家的收看 。