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&amp;java(二)
Oct 09 PHP
PHP中cookies使用指南
Mar 16 PHP
php park、unpark、ord 函数使用方法(二进制流接口应用实例)
Oct 19 PHP
PHP删除目录及目录下所有文件的方法详解
Jun 06 PHP
PHP 正则表达式常用函数
Aug 17 PHP
php开发微信支付获取用户地址
Oct 04 PHP
zen cart实现订单中增加paypal中预留电话的方法
Jul 12 PHP
详谈phpAdmin修改密码后拒绝访问的问题
Apr 03 PHP
php二维码生成以及下载实现
Sep 28 PHP
win10 apache配置虚拟主机后localhost无法使用的解决方法
Jan 27 PHP
php实现微信支付之退款功能
May 30 PHP
thinkphp5 路由分发原理
Mar 18 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设计模式 php实现状态模式
2015/12/07 PHP
PHP实现模拟http请求的方法分析
2017/12/20 PHP
JS动画效果代码3
2008/04/03 Javascript
Javascript 继承实现例子
2009/08/12 Javascript
动态载入/删除/更新外部 JavaScript/Css 文件的代码
2010/07/03 Javascript
javascript放大镜效果的简单实现
2013/12/09 Javascript
谷歌地图打不开的解决办法
2014/08/07 Javascript
AngularJS常见过滤器用法实例总结
2017/07/06 Javascript
微信小程序loading组件显示载入动画用法示例【附源码下载】
2017/12/09 Javascript
swiper动态改变滑动内容的实现方法
2018/01/17 Javascript
vue多页面开发和打包正确处理方法
2018/04/20 Javascript
Vue实现侧边菜单栏手风琴效果实例代码
2018/05/31 Javascript
node.js使用免费的阿里云ip查询获取ip所在地【推荐】
2018/09/03 Javascript
express 项目分层实践详解
2018/12/10 Javascript
通过JavaScript下载文件到本地的方法(单文件)
2019/03/17 Javascript
vue登录页面cookie的使用及页面跳转代码
2019/07/10 Javascript
javascript面向对象三大特征之继承实例详解
2019/07/24 Javascript
layui使用form表单实现post请求页面跳转的方法
2019/09/14 Javascript
如何基于filter实现网站整体变灰功能
2020/04/17 Javascript
解决vue无法侦听数组及对象属性的变化问题
2020/07/17 Javascript
原生js实现滑块区间组件
2021/01/20 Javascript
Python 字符串操作实现代码(截取/替换/查找/分割)
2013/06/08 Python
Python三元运算实现方法
2015/01/12 Python
pandas通过loc生成新的列方法
2018/11/28 Python
python 列表、字典和集合的添加和删除操作
2019/12/16 Python
如何通过Python3和ssl实现加密通信功能
2020/05/09 Python
用Python开发app后端有优势吗
2020/06/29 Python
Django用户认证系统如何实现自定义
2020/11/12 Python
CSS3的一个简单导航栏实现
2015/08/03 HTML / CSS
Fossil美国官网:Fossil手表、手袋、珠宝及配件
2017/02/01 全球购物
苹果Mac升级:MacSales.com
2017/11/20 全球购物
个性大学生自我评价
2013/12/04 职场文书
行政前台岗位职责
2013/12/04 职场文书
学子宴答谢词
2014/01/25 职场文书
大专生毕业的自我评价
2014/02/06 职场文书
PyTorch的Debug指南
2021/05/07 Python