java微信开发之上传下载多媒体文件


Posted in PHP onJune 24, 2016

回复图片、音频、视频消息都是需要media_id的,这个是需要将多媒体文件上传到微信服务器才有的。

将多媒体文件上传到微信服务器,以及从微信服务器下载文件,可以参考:http://mp.weixin.qq.com/wiki/index.php?title=上传下载多媒体文件

上传下载多媒体文件的方法还是写到WeixinUtil.java中。

代码如下:

import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.SecureRandom;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;

import net.sf.json.JSONObject;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;

import com.company.project.model.menu.AccessToken;
import com.company.project.model.menu.Menu;

public class WeixinUtil {
 private static Logger log = Logger.getLogger(WeixinUtil.class);
 public final static String APPID = "wxb927d4280e6db674";
 public final static String APP_SECRET = "21441e9f3226eee81e14380a768b6d1e";
 // 获取access_token的接口地址(GET) 限200(次/天)
 public final static String access_token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
 // 创建菜单
 public final static String create_menu_url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN";
 // 存放:1.token,2:获取token的时间,3.过期时间
 public final static Map<String,Object> accessTokenMap = new HashMap<String,Object>();
 /**
 * 发起https请求并获取结果
 * 
 * @param requestUrl 请求地址
 * @param requestMethod 请求方式(GET、POST)
 * @param outputStr 提交的数据
 * @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)
 */
 public static JSONObject handleRequest(String requestUrl,String requestMethod,String outputStr) {
 JSONObject jsonObject = null;
 
 try {
 URL url = new URL(requestUrl);
 HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
 SSLContext ctx = SSLContext.getInstance("SSL", "SunJSSE");
 TrustManager[] tm = {new MyX509TrustManager()};
 ctx.init(null, tm, new SecureRandom());
 SSLSocketFactory sf = ctx.getSocketFactory();
 conn.setSSLSocketFactory(sf);
 conn.setDoInput(true);
 conn.setDoOutput(true);
 conn.setRequestMethod(requestMethod);
 conn.setUseCaches(false);
 
 if ("GET".equalsIgnoreCase(requestMethod)) {
 conn.connect();
 }
 
 if (StringUtils.isNotEmpty(outputStr)) {
 OutputStream out = conn.getOutputStream();
 out.write(outputStr.getBytes("utf-8"));
 out.close();
 }
 
 InputStream in = conn.getInputStream();
 BufferedReader br = new BufferedReader(new InputStreamReader(in,"utf-8"));
 StringBuffer buffer = new StringBuffer();
 String line = null;
 
 while ((line = br.readLine()) != null) {
 buffer.append(line);
 }
 
 in.close();
 conn.disconnect();
 
 jsonObject = JSONObject.fromObject(buffer.toString());
 } catch (MalformedURLException e) {
 e.printStackTrace();
 log.error("URL错误!");
 } catch (IOException e) {
 e.printStackTrace();
 } catch (NoSuchAlgorithmException e) {
 e.printStackTrace();
 } catch (NoSuchProviderException e) {
 e.printStackTrace();
 } catch (KeyManagementException e) {
 e.printStackTrace();
 }
 return jsonObject;
 }
 
 /**
 * 获取access_token
 *
 * @author qincd
 * @date Nov 6, 2014 9:56:43 AM
 */
 public static AccessToken getAccessToken(String appid,String appSecret) {
 AccessToken at = new AccessToken();
 // 每次获取access_token时,先从accessTokenMap获取,如果过期了就重新从微信获取
 // 没有过期直接返回
 // 从微信获取的token的有效期为2个小时
 if (!accessTokenMap.isEmpty()) {
 Date getTokenTime = (Date) accessTokenMap.get("getTokenTime");
 Calendar c = Calendar.getInstance();
 c.setTime(getTokenTime);
 c.add(Calendar.HOUR_OF_DAY, 2);
 
 getTokenTime = c.getTime();
 if (getTokenTime.after(new Date())) {
 log.info("缓存中发现token未过期,直接从缓存中获取access_token");
 // token未过期,直接从缓存获取返回
 String token = (String) accessTokenMap.get("token");
 Integer expire = (Integer) accessTokenMap.get("expire");
 at.setToken(token);
 at.setExpiresIn(expire);
 return at;
 }
 }
 String requestUrl = access_token_url.replace("APPID", appid).replace("APPSECRET", appSecret);
 
 JSONObject object = handleRequest(requestUrl, "GET", null);
 String access_token = object.getString("access_token");
 int expires_in = object.getInt("expires_in");
 
 log.info("\naccess_token:" + access_token);
 log.info("\nexpires_in:" + expires_in);
 
 at.setToken(access_token);
 at.setExpiresIn(expires_in);
 
 // 每次获取access_token后,存入accessTokenMap
 // 下次获取时,如果没有过期直接从accessTokenMap取。
 accessTokenMap.put("getTokenTime", new Date());
 accessTokenMap.put("token", access_token);
 accessTokenMap.put("expire", expires_in);
 
 return at;
 }
 
 /**
 * 创建菜单
 *
 * @author qincd
 * @date Nov 6, 2014 9:56:36 AM
 */
 public static boolean createMenu(Menu menu,String accessToken) {
 String requestUrl = create_menu_url.replace("ACCESS_TOKEN", accessToken);
 String menuJsonString = JSONObject.fromObject(menu).toString();
 JSONObject jsonObject = handleRequest(requestUrl, "POST", menuJsonString);
 String errorCode = jsonObject.getString("errcode");
 if (!"0".equals(errorCode)) {
 log.error(String.format("菜单创建失败!errorCode:%d,errorMsg:%s",jsonObject.getInt("errcode"),jsonObject.getString("errmsg")));
 return false;
 }
 
 log.info("菜单创建成功!");
 
 return true;
 }
 
 // 上传多媒体文件到微信服务器
 public static final String upload_media_url = "http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE";
 /**
 * 上传多媒体文件到微信服务器<br>
 * @see http://www.oschina.net/code/snippet_1029535_23824
 * @see http://mp.weixin.qq.com/wiki/index.php?title=上传下载多媒体文件
 *
 * @author qincd
 * @date Nov 6, 2014 4:11:22 PM
 */
 public static JSONObject uploadMediaToWX(String filePath,String type,String accessToken) throws IOException{
 File file = new File(filePath);
 if (!file.exists()) {
 log.error("文件不存在!");
 return null;
 }
 
 String url = upload_media_url.replace("ACCESS_TOKEN", accessToken).replace("TYPE", type);
 URL urlObj = new URL(url);
 HttpURLConnection conn = (HttpURLConnection) urlObj.openConnection();
 conn.setDoInput(true);
 conn.setDoOutput(true);
 conn.setUseCaches(false);
 
 conn.setRequestProperty("Connection", "Keep-Alive");
  conn.setRequestProperty("Charset", "UTF-8");
 
  // 设置边界
  String BOUNDARY = "----------" + System.currentTimeMillis();
  conn.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=\"file\";filename=\""
    + file.getName() + "\"\r\n");
  sb.append("Content-Type:application/octet-stream\r\n\r\n");
 
  byte[] head = sb.toString().getBytes("utf-8");
 
  // 获得输出流
  OutputStream out = new DataOutputStream(conn.getOutputStream());
  out.write(head);
 
  // 文件正文部分
  DataInputStream in = new DataInputStream(new FileInputStream(file));
  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();
 
  /**
   * 读取服务器响应,必须读取,否则提交不成功
   */
   try {
   // 定义BufferedReader输入流来读取URL的响应
   StringBuffer buffer = new StringBuffer();
   BufferedReader reader = new BufferedReader(new InputStreamReader(
   conn.getInputStream()));
   String line = null;
   while ((line = reader.readLine()) != null) {
   buffer.append(line);
   }
   
   reader.close();
   conn.disconnect();
   
   return JSONObject.fromObject(buffer.toString());
   } catch (Exception e) {
   log.error("发送POST请求出现异常!" + e);
   e.printStackTrace();
   }
 return null;
 }
 
 public static final String download_media_url = "http://file.api.weixin.qq.com/cgi-bin/media/get?access_token=ACCESS_TOKEN&media_id=MEDIA_ID";
 /**
 * 从微信服务器下载多媒体文件
 *
 * @author qincd
 * @date Nov 6, 2014 4:32:12 PM
 */
 public static String downloadMediaFromWx(String accessToken,String mediaId,String fileSavePath) throws IOException {
 if (StringUtils.isEmpty(accessToken) || StringUtils.isEmpty(mediaId)) return null;
 
 String requestUrl = download_media_url.replace("ACCESS_TOKEN", accessToken).replace("MEDIA_ID", mediaId);
 URL url = new URL(requestUrl);
 HttpURLConnection conn = (HttpURLConnection) url.openConnection();
 conn.setRequestMethod("GET");
 conn.setDoInput(true);
 conn.setDoOutput(true);
 InputStream in = conn.getInputStream();
 
 File dir = new File(fileSavePath);
 if (!dir.exists()) {
 dir.mkdirs();
 }
 if (!fileSavePath.endsWith("/")) {
 fileSavePath += "/";
 }
 
 String ContentDisposition = conn.getHeaderField("Content-disposition");
 String weixinServerFileName = ContentDisposition.substring(ContentDisposition.indexOf("filename")+10, ContentDisposition.length() -1);
 fileSavePath += weixinServerFileName; 
 BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(fileSavePath));
 byte[] data = new byte[1024];
 int len = -1;
 
 while ((len = in.read(data)) != -1) {
 bos.write(data,0,len);
 }
 
 bos.close();
 in.close();
 conn.disconnect();
 
 return fileSavePath;
 }
}

测试代码:

public class WeixinUtilTest {

 /**
 *
 * @author qincd
 * @date Nov 6, 2014 9:57:54 AM
 */
 public static void main(String[] args) {
 // 1).获取access_token
 AccessToken accessToken = WeixinUtil.getAccessToken(WeixinUtil.APPID, WeixinUtil.APP_SECRET);
 String filePath = "C:\\Users\\qince\\Pictures\\壁纸20141029091612.jpg";
 JSONObject uploadJsonObj = testUploadMedia(filePath,"image",accessToken.getToken());
 if (uploadJsonObj == null) {
 System.out.println("上传图片失败");
 return;
 }
 
 int errcode = 0;
 if (uploadJsonObj.containsKey("errcode")) {
 errcode = uploadJsonObj.getInt("errcode");
 }
 if (errcode == 0) {
 System.out.println("图片上传成功");
 
 String mediaId = uploadJsonObj.getString("media_id");
 long createAt = uploadJsonObj.getLong("created_at");
 System.out.println("--Details:");
 System.out.println("media_id:" + mediaId);
 System.out.println("created_at:" + createAt);
 }
 else {
 System.out.println("图片上传失败!");
 
 String errmsg = uploadJsonObj.getString("errmsg");
 System.out.println("--Details:");
 System.out.println("errcode:" + errcode);
 System.out.println("errmsg:" + errmsg);
 }
 
 String mediaId = "6W-UvSrQ2hkdSdVQJJXShwtFDPLfbGI1qnbNFy8weZyb9Jac2xxxcAUwt8p4sYPH";
 String filepath = testDownloadMedia(accessToken.getToken(), mediaId, "d:/test");
 System.out.println(filepath);
 }


 /**
 * 上传多媒体文件到微信
 *
 * @author qincd
 * @date Nov 6, 2014 4:15:14 PM
 */
 public static JSONObject testUploadMedia(String filePath,String type,String accessToken) {
 try {
 return WeixinUtil.uploadMediaToWX(filePath, type, accessToken);
 } catch (IOException e) {
 e.printStackTrace();
 }
 
 return null;
 }
 
 /**
 * 从微信下载多媒体文件
 *
 * @author qincd
 * @date Nov 6, 2014 4:56:25 PM
 */
 public static String testDownloadMedia(String accessToken,String mediaId,String fileSaveDir) {
 try {
 return WeixinUtil.downloadMediaFromWx(accessToken, mediaId, fileSaveDir);
 } catch (IOException e) {
 e.printStackTrace();
 }
 
 return null;
 }
}

更多精彩内容请点击《Android微信开发教程汇总》,《java微信开发教程汇总》欢迎大家学习阅读。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
PHP通用分页类page.php[仿google分页]
Aug 31 PHP
php模块memcache和memcached区别分析
Jun 14 PHP
php新建文件自动编号的思路与实现
Jun 27 PHP
解析PHP中的正则表达式以及模式匹配
Jun 19 PHP
php实现扫描二维码根据浏览器类型访问不同下载地址
Oct 15 PHP
Yii基于数组和对象的Model查询技巧实例详解
Dec 28 PHP
PHP实现上传多文件示例代码
Feb 20 PHP
PHP获取HTTP body内容的方法
Dec 31 PHP
PHP开发实现快递查询功能详解
Apr 08 PHP
laravel 数据迁移与 Eloquent ORM的实现方法
Apr 12 PHP
php经典趣味算法实例代码
Jan 21 PHP
PHP实现随机发放扑克牌
Apr 21 PHP
微信公众号判断用户是否已关注php代码解析
Jun 24 #PHP
php微信开发之上传临时素材
Jun 24 #PHP
PHP微信开发之模板消息回复
Jun 24 #PHP
PHP微信开发之根据用户回复关键词\位置返回附近信息
Jun 24 #PHP
简单解析PHP程序的运行流程
Jun 23 #PHP
PHP微信开发之查询微信精选文章
Jun 23 #PHP
PHP微信开发之查询城市天气
Jun 23 #PHP
You might like
据说是雅虎的一份PHP面试题附答案
2009/01/07 PHP
php异常:Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE  eval()'d code error
2011/05/19 PHP
基于empty函数的判断详解
2013/06/17 PHP
PHP获取数组最后一个值的2种方法
2015/01/21 PHP
PJ Blog修改-禁止复制的代码和方法
2006/10/25 Javascript
JavaScript 面向对象的 私有成员和公开成员
2010/05/13 Javascript
浅析JS中document对象的一些重要属性
2014/03/06 Javascript
PHP结合jQuery实现的评论顶、踩功能
2015/07/22 Javascript
详解JavaScript的AngularJS框架中的作用域与数据绑定
2016/03/04 Javascript
一篇看懂vuejs的状态管理神器 vuex状态管理模式
2017/04/20 Javascript
Vue项目webpack打包部署到Tomcat刷新报404错误问题的解决方案
2018/05/15 Javascript
详解一个基于套接字实现长连接的express
2019/03/28 Javascript
vue实现验证用户名是否可用
2021/01/20 Vue.js
[01:02:30]Mineski vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第三场 8.22
2019/09/05 DOTA
python实现识别相似图片小结
2016/02/22 Python
Python3.6实现连接mysql或mariadb的方法分析
2018/05/18 Python
opencv python 基于KNN的手写体识别的实例
2018/08/03 Python
python使用递归的方式建立二叉树
2019/07/03 Python
python 中xpath爬虫实例详解
2019/08/26 Python
python实现大学人员管理系统
2019/10/25 Python
Python 实现顺序高斯消元法示例
2019/12/09 Python
python2.7使用scapy发送syn实例
2020/05/05 Python
python操作ini类型配置文件的实例教程
2020/10/30 Python
html5小技巧之通过document.head获取head元素
2014/06/04 HTML / CSS
西班牙自行车和跑步商店:Alltricks
2018/07/07 全球购物
法国体育用品商店:GO Sport
2019/10/23 全球购物
HashMap和Hashtable的区别
2013/05/18 面试题
abstract class和interface有什么区别?
2012/01/03 面试题
应届毕业生自我评价分享
2013/12/15 职场文书
自强之星事迹材料
2014/05/12 职场文书
警察群众路线对照检查材料思想汇报
2014/10/01 职场文书
健康状况证明书
2014/11/26 职场文书
2014年团工作总结
2014/11/27 职场文书
餐厅服务员管理制度
2015/08/05 职场文书
万能密码的SQL注入漏洞其PHP环境搭建及防御手段
2021/09/04 SQL Server
Python识别花卉种类鉴定网络热门植物并自动整理分类
2022/04/08 Python