微信 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 相关文章推荐
Asp.net下利用Jquery Ajax实现用户注册检测(验证用户名是否存)
Sep 12 Javascript
javascript object array方法使用详解
Dec 03 Javascript
JavaScript 异常处理 详解
Feb 06 Javascript
jquery动画效果学习笔记(8种效果)
Nov 13 Javascript
基于javascript html5实现多文件上传
Mar 03 Javascript
jQuery实现带延时功能的水平多级菜单效果【附demo源码下载】
Sep 21 Javascript
浅谈react前后端同构渲染
Sep 20 Javascript
js实现手机web图片左右滑动效果
Dec 29 Javascript
vuex state及mapState的基础用法详解
Apr 19 Javascript
jQuery+Datatables实现表格批量删除功能【推荐】
Oct 24 jQuery
vscode 开发Vue项目的方法步骤
Nov 25 Javascript
JavaScript 如何计算文本的行数的实现
Sep 14 Javascript
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 smarty的预保留变量总结
2008/12/04 PHP
php中的PHP_EOL换行符详细解析
2013/10/26 PHP
php实现的发送带附件邮件类实例
2014/09/22 PHP
jquery+php+ajax显示上传进度的多图片上传并生成缩略图代码
2014/10/15 PHP
php数组键名技巧小结
2015/02/17 PHP
php通过sort()函数给数组排序的方法
2015/03/18 PHP
PHP实现简单搜歌的方法
2015/07/28 PHP
Js动态创建div
2008/09/25 Javascript
ajax 缓存 问题 requestheader
2010/08/01 Javascript
javascript椭圆旋转相册实现代码
2012/01/16 Javascript
javascript学习笔记之10个原生技巧
2014/05/21 Javascript
js判断当页面无法回退时关闭网页否则就history.go(-1)
2014/08/07 Javascript
kindeditor编辑器点中图片滚动条往上顶的bug
2015/07/05 Javascript
jQuery实现响应鼠标滚动的动感菜单效果
2015/09/21 Javascript
JS 对象(Object)和字符串(String)互转方法
2016/05/20 Javascript
vue之数据交互实例代码
2017/06/20 Javascript
详解AngularJS ng-class样式切换
2017/06/27 Javascript
Vue.js实现按钮的动态绑定效果及实现代码
2017/08/21 Javascript
简述Angular 5 快速入门
2017/11/04 Javascript
MVVM框架下实现分页功能示例
2018/06/14 Javascript
Vue-Cli项目优化操作的实现
2019/10/27 Javascript
python翻译软件实现代码(使用google api完成)
2013/11/26 Python
基于Python os模块常用命令介绍
2017/11/03 Python
Python图像处理库PIL的ImageFont模块使用介绍
2020/02/26 Python
python使用Windows的wmic命令监控文件运行状况,如有异常发送邮件报警
2021/01/30 Python
HTML5 语音搜索(淘宝店语音搜素)
2013/01/03 HTML / CSS
Tom Dixon官网:英国照明及家具设计和制造公司
2019/03/01 全球购物
美国艺术和工艺品商店:Hobby Lobby
2020/12/09 全球购物
寻找迷宫的一条出路,o通路;X:障碍
2016/07/10 面试题
自主招生自荐信格式
2013/12/03 职场文书
庆祝三八妇女节标语
2014/10/09 职场文书
安全员岗位职责
2015/02/10 职场文书
应届毕业生求职简历自我评价
2015/03/02 职场文书
高中历史教学反思
2016/02/19 职场文书
经典法律座右铭(50句)
2019/08/15 职场文书
SQLServer2019 数据库的基本使用之图形化界面操作的实现
2021/04/08 SQL Server