微信JSSDK上传图片


Posted in Javascript onAugust 23, 2015

前不久微信公开了一些接口,其中有一个uploadImage接口用于上传图片,一般和chooseImage接口配合使用。先调用chooseImage接口让用户选择一张或者多张图片,用户选择完毕后微信会返回被选中图片的id,再把图片id传给uploadImage接口上传图片。

最近做的一个项目,刚好用到了JSSDK,把用到的东西整理下。

先附上微信开发者文档链接:微信开发者文档

主要用到了:

引入JS文件

在需要调用JS接口的页面引入如下JS文件,(支持https):http://res.wx.qq.com/open/js/jweixin-1.0.0.js

我们需要获取微信js-sdk参数

/** 
 * 获取access_token 
 *  
 * @param appid 
 *      凭证 
 * @param appsecret 
 *      密钥 
 * @return 
 */ 
public static WxAccessToken getAccessToken() { 
  WxAccessToken accessToken = null; 
  String requestUrl = access_token_url.replace("APPID", Setting.getSetting("WX_PL_APP_ID")).replace( 
      "APPSECRET", Setting.getSetting("APP_SECRET")); 
  JSONObject jsonObject = httpRequest(requestUrl, "GET", null); 
  // 如果请求成功 
  if (null != jsonObject) { 
    try { 
      accessToken = new WxAccessToken(); 
      accessToken.setToken(jsonObject.getString("access_token")); 
      accessToken.setExpiresIn(jsonObject.getInt("expires_in")); 
    } catch (JSONException e) { 
      accessToken = null; 
      // 获取token失败 
      log.error("获取token失败 errcode:{} errmsg:{}", 
          jsonObject.getInt("errcode"), 
          jsonObject.getString("errmsg")); 
    } 
  } 
  return accessToken; 
} 
public static String jsapiTicket = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi"; 
/** 
 * 获取JsTicket 
 *  
 * @param accessToken 
 *      accessToken 
 * @return 
 */ 
public static WxJsTicket getJsTicket(String accessToken) { 
  WxJsTicket jsTicket = null; 
  String url = jsapiTicket.replaceAll("ACCESS_TOKEN", accessToken); 
  JSONObject jsonObject = httpRequest(url, "GET", null); 
  // 如果请求成功 
  if (null != jsonObject) { 
    try { 
      jsTicket = new WxJsTicket(); 
      jsTicket.setTicket(jsonObject.getString("ticket")); 
      jsTicket.setExpiresIn(jsonObject.getInt("expires_in")); 
    } catch (JSONException e) { 
      jsTicket = null; 
      // 获取token失败 
      log.error("获取jsapiTicket失败 errcode:{} errmsg:{}", 
          jsonObject.getInt("errcode"), 
          jsonObject.getString("errmsg")); 
    } 
  } 
  return jsTicket; 
}

需要注意接口的调用次数是有限制的,需要控制好。

页面的配置

wx.config({ 
   debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 
   appId: "$!{wxsign.get('appId')}", // 必填,公众号的唯一标识 
   timestamp: "$!{wxsign.get('timeStamp')}", // 必填,生成签名的时间戳 
   nonceStr: "$!{wxsign.get('nonceStr')}", // 必填,生成签名的随机串 
   signature: "$!{wxsign.get('signature')}",// 必填,签名,见附录1 
   jsApiList: ['checkJsApi', 
         'chooseImage', 
         'previewImage', 
         'uploadImage'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 
 }); 
 
 var images = { 
  localId: [], 
  serverId: [] 
 };

拍照或从手机相册中选图接口

wx.chooseImage({
  count: 1, // 默认9
  sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有
  sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
  success: function (res) {
    var localIds = res.localIds; // 返回选定照片的本地ID列表,localId可以作为img标签的src属性显示图片
  }
});

上传图片接口

wx.uploadImage({
  localId: '', // 需要上传的图片的本地ID,由chooseImage接口获得
  isShowProgressTips: 1, // 默认为1,显示进度提示
  success: function (res) {
    var serverId = res.serverId; // 返回图片的服务器端ID
  }
});

微信返回的serverid我们需要通过微信api获取真实的图片二进制数据。

/** 
 * 获取媒体文件 
 *  
 * @param accessToken 
 *      接口访问凭证 
 * @param media_id 
 *      媒体文件id 
 * */ 
public static String downloadMedia(String mediaId,HttpServletRequest request) { 
  String requestUrl = "http://file.api.weixin.qq.com/cgi-bin/media/get?access_token=ACCESS_TOKEN&media_id=MEDIA_ID"; 
  requestUrl = requestUrl.replace("ACCESS_TOKEN", WxTokenThread.accessToken.getToken()).replace( 
      "MEDIA_ID", mediaId); 
  HttpURLConnection conn = null; 
  try { 
    URL url = new URL(requestUrl); 
    conn = (HttpURLConnection) url.openConnection(); 
    conn.setDoInput(true); 
    conn.setRequestMethod("GET"); 
    conn.setConnectTimeout(30000); 
    conn.setReadTimeout(30000); 
    BufferedInputStream bis = new BufferedInputStream( 
        conn.getInputStream()); 
    ByteArrayOutputStream swapStream = new ByteArrayOutputStream();  
    byte[] buff = new byte[100];  
    int rc = 0;  
    while ((rc = bis.read(buff, 0, 100)) > 0) {  
      swapStream.write(buff, 0, rc);  
    }  
    byte[] filebyte = swapStream.toByteArray();  
    return PictureStore.getInstance().getImageServerUrl() + PictureStore.getInstance().store(filebyte); 
  } catch (Exception e) { 
    e.printStackTrace(); 
  } finally { 
    if(conn != null){ 
      conn.disconnect(); 
    } 
  } 
  return ""; 
}

整体上做这个功能还是比较简单的,只不过以前没有接触过微信api。

微信 jssdk 上传多张图片

代码如下:

jssdk

$('#filePicker').on('click', function () {
 wx.chooseImage({
  success: function (res) {
   var localIds = res.localIds;
   syncUpload(localIds);
  }
 });
});
var syncUpload = function(localIds){
 var localId = localIds.pop();
 wx.uploadImage({
  localId: localId,
  isShowProgressTips: 1,
  success: function (res) {
   var serverId = res.serverId; // 返回图片的服务器端ID
   //其他对serverId做处理的代码
   if(localIds.length > 0){
    syncUpload(localIds);
   }
  }
 });
};

本文给大家分享了微信JSSDK上传图片的方法,希望对大家今后的工作学习有所帮助,当然方法也不止以上一种,还有很多,欢迎大家多多分享自己的经验。

Javascript 相关文章推荐
jquery validate poshytip 自定义样式
Nov 26 Javascript
jquery ajax,ashx,json的用法总结
Feb 12 Javascript
js统计页面的来访次数实现代码
May 09 Javascript
使用node.js 获取客户端信息代码分享
Nov 26 Javascript
jscript读写二进制文件的方法
Apr 22 Javascript
JQuery实现鼠标滚轮滑动到页面节点
Jul 28 Javascript
Angularjs全局变量被作用域监听的正确姿势
Feb 06 Javascript
谈一谈JS消息机制和事件机制的理解
Apr 14 Javascript
jQuery使用each方法与for语句遍历数组示例
Jun 16 Javascript
小程序:授权、登录、session_key、unionId的详解
May 15 Javascript
微信小程序登录对接Django后端实现JWT方式验证登录详解
Jul 29 Javascript
react native 仿微信聊天室实例代码
Sep 17 Javascript
基于jquery实现人物头像跟随鼠标转动
Aug 23 #Javascript
jquery+css实现绚丽的横向二级下拉菜单-附源码下载
Aug 23 #Javascript
jquery ajax 如何向jsp提交表单数据
Aug 23 #Javascript
纯HTML5制作围住神经猫游戏-附源码下载
Aug 23 #Javascript
javascript中Array()数组函数详解
Aug 23 #Javascript
jquery+css实现的红色线条横向二级菜单效果
Aug 22 #Javascript
js实现的二级横向菜单条实例
Aug 22 #Javascript
You might like
如何隐藏你的.php文件
2007/01/04 PHP
解析获取优酷视频真实下载地址的PHP源代码
2013/06/26 PHP
Yii2框架引用bootstrap中日期插件yii2-date-picker的方法
2016/01/09 PHP
CI映射(加载)数据到view层的方法
2016/03/28 PHP
Laravel5.4框架使用socialite实现github登录的方法
2019/03/20 PHP
使用JS操作页面表格,元素的一些技巧
2007/02/02 Javascript
让FireFox支持innerText的实现代码
2009/12/01 Javascript
js下利用控制器载入对应脚本
2010/07/17 Javascript
jquery获取div距离窗口和父级dv的距离示例
2013/10/10 Javascript
javascript scrollTop正解使用方法
2013/11/14 Javascript
jquery1.10给新增元素绑定事件的方法
2014/03/06 Javascript
AngularJS equal比较对象实例详解
2016/09/14 Javascript
JavaScript 动态三角函数实例详解
2017/01/08 Javascript
原生js实现对Ajax的封装(仿jquery)
2017/01/22 Javascript
JavaScript中各数制转换全面总结
2017/08/21 Javascript
手把手教你vue-cli单页到多页应用的方法
2018/05/31 Javascript
layui(1.0.9)文件上传upload,前后端的实例代码
2019/09/26 Javascript
jQuery实现滑动星星评分效果(每日分享)
2019/11/13 jQuery
微信小程序中target和currentTarget的区别小结
2020/11/06 Javascript
[02:54]DOTA2英雄基础教程 撼地者
2014/01/14 DOTA
Python实现抓取网页并且解析的实例
2014/09/20 Python
Python基础学习之常见的内建函数整理
2017/09/06 Python
CentOS 6.5中安装Python 3.6.2的方法步骤
2017/12/03 Python
Python Numpy 实现交换两行和两列的方法
2019/06/26 Python
Python 转换文本编码实现解析
2019/08/27 Python
Tensorflow轻松实现XOR运算的方式
2020/02/03 Python
Pycharm远程连接服务器并实现代码同步上传更新功能
2020/02/25 Python
python如何获得list或numpy数组中最大元素对应的索引
2020/11/16 Python
详解python使用金山词霸的翻译功能(调试工具断点的使用)
2021/01/07 Python
html5 canvas 简单画板实现代码
2012/01/05 HTML / CSS
世界上最大的街头服饰网站:Karmaloop
2017/02/04 全球购物
Jo Malone美国官网:祖玛珑香水
2017/03/27 全球购物
2014信息技术专业毕业生自我评价
2014/01/17 职场文书
《燕子》教学反思
2014/02/18 职场文书
学校青年志愿者活动总结
2015/05/06 职场文书
2019年特色火锅店的创业计划书模板
2019/08/28 职场文书