微信 java 实现js-sdk 图片上传下载完整流程


Posted in Javascript onOctober 21, 2016

最近做的一个项目刚好用到微信js-sdk的图片上传接口,在这里做一下总结。

在这里能知道使用js api的基本配置

https://mp.weixin.qq.com/wiki

t=resource/res_main&id=mp1421141115&token=&lang=zh_CN

我这里没有用checkJsApi去判断当前客户端版本是否支持指定JS接口,好。通过看开发文档,我们知道调用js接口直接都要通过config接口注入权限验证配置

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

获取config里面参数的代码如下,我这里只用到chooseImage和uploadImage接口,chooseImage接口是拍照或从手机相册中选图接口,uploadImage接口是用来上传图片,所以jsApiList里面只写这两个就可以了

<code class="hljs avrasm">import java.util.UUID;
import java.util.Map;
import java.util.HashMap;
import java.util.Formatter;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.io.UnsupportedEncodingException;
 
public class WxConfig {
  public static void main(String[] args) {
    String jsapi_ticket = "jsapi_ticket";
 
    // 注意 URL 一定要动态获取,不能 hardcode
    String url = "http://example.com";
    Map<string, string=""> ret = sign(jsapi_ticket, url);
    for (Map.Entry entry : ret.entrySet()) {
      System.out.println(entry.getKey() + ", " + entry.getValue());
    }
  };
 
  public static Map<string, string=""> sign(String jsapi_ticket, String url) {
    Map<string, string=""> ret = new HashMap<string, string="">();
    String nonce_str = create_nonce_str();
    String timestamp = create_timestamp();
    String string1;
    String signature = "";
 
    //注意这里参数名必须全部小写,且必须有序
    string1 = "jsapi_ticket=" + jsapi_ticket +
        "&noncestr=" + nonce_str +
        "×tamp=" + timestamp +
        "&url=" + url;
    System.out.println(string1);
 
    try
    {
      MessageDigest crypt = MessageDigest.getInstance("SHA-1");
      crypt.reset();
      crypt.update(string1.getBytes("UTF-8"));
      signature = byteToHex(crypt.digest());
    }
    catch (NoSuchAlgorithmException e)
    {
      e.printStackTrace();
    }
    catch (UnsupportedEncodingException e)
    {
      e.printStackTrace();
    }
 
    ret.put("url", url);
    ret.put("jsapi_ticket", jsapi_ticket);
    ret.put("nonceStr", nonce_str);
    ret.put("timestamp", timestamp);
    ret.put("signature", signature);
 
    return ret;
  }
 
  private static String byteToHex(final byte[] hash) {
    Formatter formatter = new Formatter();
    for (byte b : hash)
    {
      formatter.format("%02x", b);
    }
    String result = formatter.toString();
    formatter.close();
    return result;
  }
 
  private static String create_nonce_str() {
    return UUID.randomUUID().toString();
  }
 
  private static String create_timestamp() {
    return Long.toString(System.currentTimeMillis() / 1000);
  }
}
</string,></string,></string,></string,></code>

ticket可以通过accessToken获取,代码如下

<code class="hljs cs">public static String getTicket(String accessToken) throws ParseException, IOException {
    public final static String sign_ticket_create_url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi";
    JSONObject jsonObject = new JSONObject();
    JSONObject postjson=new JSONObject();
    String ticket =null;
    String url = sign_ticket_create_url.replace("ACCESS_TOKEN",accessToken);
    System.out.print("url="+url);
    String ticketurl ="";
    try {
      jsonObject = WeixinUtil.httpsRequest(url, "POST",postjson.toString());
      ticket= jsonObject.getString("ticket");
      System.out.println("ticket:"+ticket);
    }catch (Exception e) {
      e.printStackTrace();
    }
    return ticket;
  };</code>

当注入权限验证成功的时候会进入ready接口,那么我们就在ready接口里面继续我们需要的操作

<code class="hljs javascript">wx.ready(function(){
    //拍照或从手机相册中选图接口
    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: localIds.toString(), // 需要上传的图片的本地ID,由chooseImage接口获得
          isShowProgressTips: 1, // 默认为1,显示进度提示
          success: function (res) {
            var serverId = res.serverId; // 返回图片的服务器端ID
          }
        });
      }
    });
  });</code>

通过以上代码,我们就已经把图片上传到微信服务器了,但是我们上传到微信服务器的图片只能保存3天,所以上传完之后我们要把图片下载到我们的本地服务器,这里用到微信下载多媒体接口

http://file.api.weixin.qq.com/cgi-bin/media/get?

access_token=ACCESS_TOKEN&media_id=MEDIA_ID

其中media_id就是我们上面的serverId ,所以我们就可以把图片下载到本地了,代码如下

<code class="hljs java">import org.apache.log4j.Level;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.apache.log4j.Priority;
import org.springframework.util.StringUtils;
 
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
 
public class DloadImgUtil {
 /**
  * 根据内容类型判断文件扩展名
  *
  * @param contentType 内容类型
  * @return
  */
 public static String getFileexpandedName(String contentType) {
  String fileEndWitsh = "";
  if ("image/jpeg".equals(contentType))
   fileEndWitsh = ".jpg";
  else if ("audio/mpeg".equals(contentType))
   fileEndWitsh = ".mp3";
  else if ("audio/amr".equals(contentType))
   fileEndWitsh = ".amr";
  else if ("video/mp4".equals(contentType))
   fileEndWitsh = ".mp4";
  else if ("video/mpeg4".equals(contentType))
   fileEndWitsh = ".mp4";
  return fileEndWitsh;
 }
 /**
  * 获取媒体文件
  * @param accessToken 接口访问凭证
  * @param mediaId 媒体文件id
  * @param savePath 文件在本地服务器上的存储路径
  * */
 public static String downloadMedia(String accessToken, String mediaId, String savePath) {
  try {
   accessToken = WeixinUtil.getAccessToken1().getToken();
  } catch (IOException e) {
   e.printStackTrace();
  }
  String filePath = null;
  // 拼接请求地址
  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", accessToken).replace("MEDIA_ID", mediaId);
  try {
   URL url = new URL(requestUrl);
   HttpURLConnection conn = (HttpURLConnection) url.openConnection();
   conn.setDoInput(true);
   conn.setRequestMethod("GET");
 
   if (!savePath.endsWith("/")) {
    savePath += "/";
   }
   // 根据内容类型获取扩展名
   String fileExt = DloadImgUtil .getFileexpandedName(conn.getHeaderField("Content-Type"));
   // 将mediaId作为文件名
   filePath = savePath + mediaId + fileExt;
   BufferedInputStream bis = new BufferedInputStream(conn.getInputStream());
   FileOutputStream fos = new FileOutputStream(new File(filePath));
   byte[] buf = new byte[8096];
   int size = 0;
   while ((size = bis.read(buf)) != -1)
    fos.write(buf, 0, size);
   fos.close();
   bis.close();
 
   conn.disconnect();
   String info = String.format("下载媒体文件成功,filePath=" + filePath);
   System.out.println(info);
  } catch (Exception e) {
   filePath = null;
   String error = String.format("下载媒体文件失败:%s", e);
   System.out.println(error);
  }
  return filePath;
 }
}
</code>

这样就完成了js-sdk图片上传下载了。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Javascript 相关文章推荐
List the Codec Files on a Computer
Jun 11 Javascript
ASP.NET jQuery 实例11 通过使用jQuery validation插件简单实现用户登录页面验证功能
Feb 03 Javascript
基于jquery实现省市联动特效
Dec 17 Javascript
JavaScript组合模式学习要点
Aug 26 Javascript
微信小程序 九宫格实例代码
Jan 21 Javascript
详解Angular2 之 结构型指令
Jun 21 Javascript
使用 jQuery 实现表单验证功能
Jul 05 jQuery
js数组去重的N种方法(小结)
Jun 07 Javascript
jQuery实现根据身份证号获取生日、年龄、性别等信息的方法
Jan 09 jQuery
vue使用websocket的方法实例分析
Jun 22 Javascript
浅谈Vue3.0之前你必须知道的TypeScript实战技巧
Sep 11 Javascript
jquery简易手风琴插件的封装
Oct 13 jQuery
Javascript 实现微信分享(QQ、朋友圈、分享给朋友)
Oct 21 #Javascript
Bootstrap如何创建表单
Oct 21 #Javascript
bootstrap table小案例
Oct 21 #Javascript
jquery+Jscex打造游戏力度条
Sep 12 #Javascript
基于百度地图实现产品销售的单位位置查看功能设计与实现
Oct 21 #Javascript
node.js学习之base64编码解码
Oct 21 #Javascript
JavaScript浮点数及运算精度调整详解
Oct 21 #Javascript
You might like
PHP错误Parse error: syntax error, unexpected end of file in test.php on line 12解决方法
2014/06/23 PHP
PHP过滤黑名单关键字的方法
2014/12/01 PHP
PHP提取字符串中的手机号正则表达式怎么写
2017/07/17 PHP
关于Ext中form移除textfield方法:hide(),setVisible(false),remove()
2010/12/02 Javascript
JavaScript数值转换的三种方式总结
2014/07/31 Javascript
js命名空间写法示例
2015/12/18 Javascript
微信小程序-消息提示框实例
2016/11/24 Javascript
JavaScript的变量声明提升问题浅析(Hoisting)
2016/11/30 Javascript
详解使用JS如何制作简单的ASCII图与单极图
2017/03/31 Javascript
浅谈react.js中实现tab吸顶效果的问题
2017/09/06 Javascript
Vue-cli Eslint在vscode里代码自动格式化的方法
2018/02/23 Javascript
使用vue点击li,获取当前点击li父辈元素的属性值方法
2018/09/12 Javascript
浅析js中mvvm模式实现的原理
2018/10/06 Javascript
微信小程序 确认框的实现(附代码)
2019/07/23 Javascript
layui动态渲染生成select的option值方法
2019/09/23 Javascript
vue动态循环出的多个select出现过的变为disabled(实例代码)
2019/11/10 Javascript
python实现发送邮件功能
2017/07/22 Python
Python基于回溯法子集树模板解决取物搭配问题实例
2017/09/02 Python
对python3 一组数值的归一化处理方法详解
2018/07/11 Python
python生成lmdb格式的文件实例
2018/11/08 Python
python 判断三个数字中的最大值实例代码
2019/07/24 Python
解析Python3中的Import
2019/10/13 Python
Pytorch 使用CNN图像分类的实现
2020/06/16 Python
Python使用eval函数执行动态标表达式过程详解
2020/10/17 Python
美国顶级户外凉鞋品牌:Chacos
2017/03/27 全球购物
Java程序员综合测试题
2014/04/25 面试题
教师实习期自我鉴定
2013/10/06 职场文书
乡镇交通安全实施方案
2014/03/29 职场文书
高考励志标语
2014/06/05 职场文书
财务审计整改报告
2014/11/06 职场文书
入党自传范文2015
2015/06/26 职场文书
公文写作指导之倡议书!
2019/07/03 职场文书
详细介绍python类及类的用法
2021/05/31 Python
浅谈@Value和@Bean的执行顺序问题
2021/06/16 Java/Android
前端JavaScript大管家 package.json
2021/11/02 Javascript
virtualenv隔离Python环境的问题解析
2022/06/21 Python