首先说一下需求:白鹭引擎中使用webgl的情况下某些ios没法直接下载显示微信用户头像(应该是认证相关的东西吧),而使用canvas模式又十分耗费性能、手机极易发热。所以只能在客户端请求的时候获取用户头像然后下载到自己的服务器上。

1.思路:

创建一个表,用于存放 用户-头像,并在请求时校验,如果存在则直接返回服务端图片地址,否则下载。

2.伪代码

注:这个接口还要额外配置拦截器白名单
/*** 下载微信头像* * @param urlList*/@ResponseBody@RequestMapping(value = "image/getWechatImg")public ResultTO downloadWechatImgs(String[] users,HttpServletRequest request,HttpServletResponse response) {response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");response.setHeader("Access-Control-Max-Age", "0");response.setHeader("Access-Control-Allow-Headers", "Origin, No-Cache, X-Requested-With, If-Modified-Since, Pragma, Last-Modified, Cache-Control, Expires, Content-Type, X-E4M-With,userId,token");response.setHeader("Access-Control-Allow-Credentials", "true");ModelMap headMap = new ModelMap();URL url = null;try {// 搜索已经下载头像的用户,排除。其他的用户下载头像if (users != null && users.length > 0) {@SuppressWarnings({ "unchecked", "rawtypes" })List<String> all = new ArrayList(Arrays.asList(users));//知识点,如果直接使用asList转换在remove时会报错List<WechatImg> wechatImg = mediaService.getWechatImg(users);for (WechatImg img : wechatImg) {// 遍历,如果已经有的用户需要删除避免重新下载int length = all.size();for (int a = 0; a < length; a++) {if (img.getUser().equals(all.get(a))) {all.remove(a);break;}}headMap.put(img.getUser(), img.getImg()); // 将数据库中的头像放入返返回的map}// 剩下all中的用户都需要下载头像,加载需要获取头像的用户信息if (!all.isEmpty()) {//通过用户id查询对应的用户信息、头像List<BaseUser> list = mediaService.searchBaseUserByIds(all);if (list != null && !list.isEmpty()) {// 循环下载用户头像并且存放List<WechatImg> saveList = new ArrayList<>(); // 如果下载成功需要存库的数据for (BaseUser user : list) {try {String image = user.getImage();// 首先,获取用户的if (StringUtils.isBlank(image)) {headMap.put(user.getId(), ""); // 如果当前用户没有头像则直接返回空字符串continue;}url = new URL(image);DataInputStream dataInputStream = new DataInputStream(url.openStream());// 微信头像专门放置点String filePath = imgPath + ManageConstants.UPLOAD_DEFALUT.toString() + "wechatImg/";//服务端路径和图片名称String imageName = filePath    + UUIDUtil.getUUID() + ".png";// 检查文件夹是否存在File checkFolder = new File(imgPath + ManageConstants.UPLOAD_DEFALUT.toString() + "wechatImg");if (!checkFolder.exists()) {checkFolder.mkdir();}FileOutputStream fileOutputStream = new FileOutputStream(new File(imageName));ByteArrayOutputStream output = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int length;while ((length = dataInputStream.read(buffer)) > 0) {output.write(buffer, 0, length);}fileOutputStream.write(output.toByteArray());dataInputStream.close();fileOutputStream.close();WechatImg saveImg = new WechatImg();saveImg.setImg(imageName.substring(imageName.indexOf(ManageConstants.UPLOAD_DEFALUT.toString())));saveImg.setUser(user.getId());saveList.add(saveImg);headMap.put(user.getId(), saveImg.getImg());} catch (MalformedURLException e) {headMap.put(user.getId(), ""); // 如果下载头像报错直接返回空字符串logger.error(e);} catch (IOException e) {headMap.put(user.getId(), ""); // 如果下载头像报错直接返回空字符串logger.error(e);}}// 循环后如果有需要存储的用户则存放if (!saveList.isEmpty()) {mediaService.saveWechatImgs(saveList);}}}}} catch (Exception e) {e.printStackTrace();}String jsonString = JSON.toJSONString(headMap);return new AccessSuccessResult(jsonString);}

java服务端下载微信头像并返回客户端相关推荐

  1. Java 服务端 socket 掉线重启后,客户端自动重连

    目的 强调:setSoTimeout()函数的重要性,目的是为了写出更健壮的程序. 问题:如果客户端发起的socket 在连接后,读取数据流之前,刚好服务器端突然断线了,紧接着又重启了,则当前sock ...

  2. java版冒险岛_CMS072 冒险岛ONLINE 国服072版本 JAVA 服务端 - 下载 - 搜珍网

    压缩包 : 285a42a6d590f64a02a608a40aa56f0e.rar 列表 文件封包.txt Extra/buff information provider.bat Extra/dum ...

  3. 基于TCP/IP协议的Java服务端与Android客户端的Socket通信及数据交互

    基于TCP/IP协议的Java服务端与Android客户端的Socket通信及数据交互 一.前言 1.Java服务端程序代码的项目名为TcpSocketServerOfJava,包名为com.exam ...

  4. 有道智云OCR图片识别文字+返回数据处理技巧(实现语言-按键精灵脚本请求识别+java服务端处理数据)

    一.[开始] 1.按键精灵android手机脚本 1.1.截取手机上指定范围内的图片,通过api上传到有道智云处理后返回识别后的JSON格式数据. 1.2.代码 Import "ShanHa ...

  5. Flex通信-Java服务端通信实例

    Flex与Java通信的方式有很多种,比较常用的有以下方式: WebService:一种跨语言的在线服务,只要用特定语言写好并部署到服务器,其它语言就可以调用 HttpService:通过http请求 ...

  6. java实现客户端 与服务端的对话_Socket实现单客户端与服务器对话功能

    单客户端,顾名思义,就是客户端只有一个用户去访问服务器,然后服务器根据该客户请求返回信息,先看下效果图: 服务端(左)和客户端(右): 注意,我是用了两个eclipse,一个只放服务端文件,一个只放客 ...

  7. 支付宝APP支付Java服务端

    支付宝APP支付Java服务端: 公司项目要求对接支付宝进行支付功能,这边做出整理方便以后使用(支付宝的支付对接还是很简单的). 1):去支付宝开放平台,-1.注册账号,2.创建应用 3.配置应用 4 ...

  8. app及Java服务端实现JT808协议的定义解析

    app及Java服务端实现JT808协议的定义解析,可以用做行车记录仪等的app. 网上很多帖子已经对JT808协议做了说明,我在这里就不做过多的赘述了. 最近接到一个项目是打车类的,所以对这协议做了 ...

  9. JAVA服务端实现页面截屏(附代码)

    JAVA服务端实现页面截屏 适配需求 方案一.使用JxBrowser 使用步骤: 方案二.JavaFX WebView 使用步骤: 方案三.Headless Chrome 使用步骤: 综上方案对比 记 ...

最新文章

  1. JSP生成静态HTML页面的实践方法和设计思路
  2. Springboot中的缓存Cache和CacheManager原理介绍
  3. MySQL中空字符串与null的区别:计数 判断 时间
  4. php 什么时候销毁对象,什么决定什么时候在PHP中销毁类对象?
  5. 《C专家编程》一1.6 它很棒,但它符合标准吗
  6. 学习Python不需要程基础?
  7. 初学者应该如何有效率的系统学习Python开发
  8. 你们真的了解JS的事件吗?
  9. QQ for Linux 安装和卸载
  10. Linux完全卸载mysql数据库
  11. CycleGAN网络详解
  12. MES助力日立电梯提升精细化管理水平
  13. 局域网内连接其他计算机共享的打印机
  14. 最短哈密尔顿圈matlab解法_数学建模学习笔记
  15. 微信记账小程序(附源码),你值得拥有!
  16. 解决:使用@符号,报错:找不到模块“@”或其响应的类型声明。
  17. 阿里云学生白嫖的服务器有什么用处?
  18. 字节跳动校招前端面经(2021.03.16)
  19. OpenCV:Scalar数据类型理解
  20. 电力窃漏电用户自动识别的实验报告

热门文章

  1. CAD保存文件为各种格式
  2. 免费在线基本电气图 + 示例
  3. linux摄像头软件安装,Linux如何安装zoneminder软件
  4. 机器学习中的先验、后验和似然
  5. java判断图片是否被修改过_4种方法判断图片是否被PS处理过,你都会吗? | X的博客...
  6. CryENGINE3系列总结教程之UI/HUD(二)Flash资源导入CE3
  7. Libgdx游戏编程之Touchpad摇杆控制角色行走
  8. 电脑如何快速打开其它磁盘文件夹?
  9. LTE-4G网络普及
  10. Windows下解决TerminateThread终止线程导致死锁问题