一、前提说明

很多微信开发的场景需要传一个mediaId,即微信素材的媒体id,根据[微信开放平台接口文档],将已知网络图片URL上传到微信服务器,并换取媒体id,这个地方用到缓存。相关代码如下:(https://developers.weixin.qq.com/doc/offiaccount/Asset_Management/New_temporary_materials.html)

二、相关代码

/*** 上传临时素材到微信换取mediaId* 1、临时素材media_id是可复用的。* 2、媒体文件在微信后台保存时间为3天,即3天后media_id失效。*** @param appId 小程序appId* @param imageUrl 图片的URL* @param userUuId 顾问的UuId* @return*/public String getMediaIdByImageUrl(String appId, String userUuId, String imageUrl) {log.info("getMediaIdBy_appId:{},ImageUrl:{}, userUuId:{}", appId, imageUrl,userUuId);String redisKey = "user_media_id_" + appId + "_" + userUuId;String mediaId = redisTemplate.opsForValue().get(redisKey);if (StringUtil.isNotEmpty(mediaId)) {log.info("getMediaIdByImageUrl_redis_mediaId:{}", mediaId);return mediaId;}//缓存拿不到String accessToken = commonService.getAccessToken(appId, Boolean.TRUE);try {mediaId = HttpUtil.getMediaIdFromUrl("https://api.weixin.qq.com/cgi-bin/media/upload?access_token=" + accessToken + "&type=image", imageUrl);} catch (Exception e) {log.error("getMediaIdByImageUrl_e:{}", e);}if (StringUtil.isNotEmpty(mediaId)) {//存入缓存,缓存3天redisTemplate.opsForValue().set(redisKey, mediaId, 3, TimeUnit.DAYS);}log.info("getMediaIdByImageUrl_mediaId:{}", mediaId);return mediaId;}
 /*** 网络图片上传到微信服务器** @param urlPath 图片路径* @return JSONObject* @throws Exception*/public static String getMediaIdFromUrl(String url, String urlPath) throws Exception {String result = null;String fileName = urlPath.substring(urlPath.lastIndexOf("/") + 1);// 获取网络图片URL mediaUrl = new URL(urlPath);HttpURLConnection meidaConn = (HttpURLConnection) mediaUrl.openConnection();meidaConn.setDoOutput(true);meidaConn.setRequestMethod("GET");/*** 第一部分*/URL urlObj = new URL(url);HttpURLConnection con = (HttpURLConnection) urlObj.openConnection();con.setRequestMethod("POST"); // 以Post方式提交表单,默认get方式con.setDoInput(true);con.setDoOutput(true);con.setUseCaches(false); // post方式不能使用缓存// 设置请求头信息con.setRequestProperty("Connection", "Keep-Alive");con.setRequestProperty("Charset", "UTF-8");// 设置边界String BOUNDARY = "----------" + System.currentTimeMillis();con.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY);// 请求正文信息// 第一部分:StringBuilder sb = new StringBuilder();sb.append("--"); // 必须多两道线sb.append(BOUNDARY);sb.append("\r\n");sb.append("Content-Disposition: form-data;name=\"media\";filename=\"" + fileName + "\"\r\n");sb.append("Content-Type:application/octet-stream\r\n\r\n");byte[] head = sb.toString().getBytes("utf-8");// 获得输出流OutputStream out = new DataOutputStream(con.getOutputStream());// 输出表头out.write(head);// 文件正文部分// 把文件已流文件的方式 推入到url中DataInputStream in = new DataInputStream(meidaConn.getInputStream());int bytes = 0;byte[] bufferOut = new byte[1024];while ((bytes = in.read(bufferOut)) != -1) {out.write(bufferOut, 0, bytes);}in.close();// 结尾部分byte[] foot = ("\r\n--" + BOUNDARY + "--\r\n").getBytes("utf-8");// 定义最后数据分隔线out.write(foot);out.flush();out.close();meidaConn.disconnect();StringBuffer buffer = new StringBuffer();BufferedReader reader = null;try {// 定义BufferedReader输入流来读取URL的响应reader = new BufferedReader(new InputStreamReader(con.getInputStream()));String line = null;while ((line = reader.readLine()) != null) {buffer.append(line);}if (result == null) {result = buffer.toString();}} catch (IOException e) {e.printStackTrace();throw new IOException("数据读取异常");} finally {if (reader != null) {reader.close();}}JSONObject jsonObj = JSON.parseObject(result);return jsonObj.getString("media_id");}

上传网络图片到微信临时素材换取mediaId相关推荐

  1. 微信临时素材接口_在接口中表达临时性

    微信临时素材接口 When interacting with today's graphic user interfaces (GUI), we experience a sense of reali ...

  2. 图片上传(调用微信接口)

    图片上传之原生方法 图片上传.压缩.回显.缩略图放大.删除.下载,可以参考这儿(h5方法) https://github.com/zhangstar1331/pictureUpload 效果展示 背景 ...

  3. 使用淘宝open api直接上传网络图片的方法

    之前看到有人在网络求教<淘宝api的吗?求问如何直接上传网络图片>,为了让新人少走弯路,以下是小编写整理相关解决方法. 代码经过测试(可以看后面的返回结果) 比如:https://www. ...

  4. php 使用curl发送图片素材到微信临时素材库

    //图片素材保存到微信临时素材库并返回mediaIDaprotected function sendImgtoWechat($username = ''){$saveDir = ROOTPATH . ...

  5. 关于微信小程序上传,在微信公众平台|小程序中找不到上传的代码

    2019/05/16 小程序小白入门 最开始的时候,我不知道该如何上传自己的代码.打开微信开发平台,找到"工具"选项,再点击"上传"就好了 ①找到"工 ...

  6. 后台php微信jssdk上传多张图片,微信JSSDK上传多张图片

    作过微信开发的都知道,在部分android机型里微信不支持网页上传图片的,这是因为这些机型的文件上传存在内存泄漏,会致使微信闪退,因此微信内置浏览器将文件上传屏蔽.这就致使这些机型的用户在使用微信浏览 ...

  7. 使用微信临时素材库上传与获取图片

    在开发微信小程序的客服,发送客服消息时,由于使用到了图片,于是用到了微信的临时素材库 上传图片 调用以下接口: POST https://api.weixin.qq.com/cgi-bin/media ...

  8. 使用httpclient4.3.2来实现微信临时素材的上传

    一直在用java来做微信的二次开发,经过一段时间的沉淀总算有了一点门路.其实用java这种强大的语言来做微信的二次开发是很简单的事情.只要解决了加密.https请求的发送.xml的解析这些基本的操作后 ...

  9. RestTemplate上传微信临时素材

    上传网路图片 String accessToken = "";String apiUrl = ApiMaterialUrl.upload(accessToken, material ...

最新文章

  1. SpringMVC工作原理详解
  2. CRM User Status profile中Business Transaction字段的用途
  3. Win11系统如何调节字体大小
  4. JavaScript之 Bom+Dom
  5. 互联网搜索的哪些环节 机器学习_什么是机器学习?有哪些分类?到底有什么用?终于有人讲明白了...
  6. c语言中L''作用,L/C问题: 请问L/C上的49:Confirmation Instruction 有什么作用啊[1]
  7. SQL Server 2005 中的客户端 XML 处理
  8. ​FMEA失效模式分析中风险评估「SOD」标准
  9. 21天学通C语言-学习笔记(6)
  10. 计算机基础知识vf试题及答案,2016年计算机二级考试《VF》上机试题及答案(1)
  11. 专利代理人资格考试怎么准备
  12. 你会为了钱出售自己的个人资料吗?
  13. 5GC基础:架构和网元
  14. 进制转换的算法及进制在线转换器
  15. 机器学习实战决策树画图理解
  16. 微信小程序全局变量的定义、使用、修改
  17. freemarker模板生成word文档踩坑记录
  18. ubuntu 17\18.04 调节鼠标指针速度
  19. Potree使用指南
  20. python调用第三方库需要联网吗_离线环境安装python第三方库

热门文章

  1. winPE无法识别SSD的解决方案(关闭VMD)
  2. 升级鸿蒙后不支持快充?华为:充电器山寨的
  3. ThinkPHP5.0微信公众号开发之 微信公众号接入
  4. 全栈仿抖音小程序--登陆、注册、注销模块
  5. 强力党逗志芃(蓝桥杯)python解法
  6. 软件项目管理相关内容1:项目介绍与背景 2:乙方投标书 3:合同 4:生存期模型 5:需求规格说明书 6:WBS 7:成本估算 8:甘特图 9:进度计划 10:质量计划 11:项目总结
  7. 使用Stream流对集合排序
  8. python单链表类_python 链表类
  9. _rasa_chatbot_Rasa Chatbot,Node Red和快速的Web接口
  10. Vue 的响应式原理