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

回复图片、音频、视频消息都是需要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 MapaccessTokenMap = new HashMap();

/**

* 发起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";

/**

* 上传多媒体文件到微信服务器

* @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;

}

}

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

http://www.bkjia.com/PHPjc/1138986.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/1138986.htmlTechArticlejava微信开发之上传下载多媒体文件,java上传下载 回复图片、音频、视频消息都是需要media_id的,这个是需要将多媒体文件上传到微信服务...

java微信上传本地视频教程_java微信开发之上传下载多媒体文件,java上传下载_PHP教程...相关推荐

  1. 电脑企业微信怎么发送本地文件给微信好友?

    电脑上使用办公工具企业微信可帮助大家将个人微信的交际圈和工作时的客户区分开来,企业微信的功能和个人微信有很多类似之处,如可以发送文本聊天语言,可以传输图片,也可以发送文件等. 文章来源:电脑企业微信怎 ...

  2. java微信公众号获取地理位置_Java微信公众平台开发之获取地理位置

    本部分需要用到微信的JS-SDK,微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包. 通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照.选图.语音.位置等手机系 ...

  3. java写微信小程序答辩问题_java微信小程序开发中加密解密算法总结

    详解java微信小程序开发中加密解密算法 一.概述 微信推出了小程序,很多公司的客户端应用不仅具有了APP.H5.还接入了小程序开发.但是,小程序中竟然没有提供Java版本的加密数据解密算法.这着实让 ...

  4. java微信普通群发图文消息_java微信发送图文和文字消息

    1.获取token public static Map getAccessToken(WxConstant wxConstant) { // 第二步获取有效的access_token try { St ...

  5. java微信公众号支付退款_java 微信公众号支付 详细教程【站长吐血整理】

    maven或者gradle 项目记得引用第三方开放的sdk工具类,微信支付的,很全 微信开发者第三方sdk库资料:weixin-popular compile group: 'com.github.w ...

  6. (第三方平台)开发相关,解除80端口占用,微信公众号分享jssdk实现,微信开放平台登录接口接入,2022微信分享接入本地调试,微信分享定制

    一.开发相关 1.平台地址 微信开放平台 QQ互联平台SDK 2.文章收集 来自CSDN兄台的QQ登录使用的教程 微信网站应用开发的详细流程和引导 VueJs单页应用实现微信网页授权及微信分享功能 [ ...

  7. python网络编程视频教程_Java网络开发视频教程 – 一站式学习Java网络编程视频教程 全面理解BIO(无密)...

    Java网络开发视频教程 – 一站式学习Java网络编程视频教程 全面理解BIO(无密) 全面理解BIO/NIO/AIO 网络层编程,是每一个开发者都要面对的技术.课程为解决大家学习网络层知识的难题, ...

  8. java里面的环链怎么做_Java模式开发之责任链模式

    从前往后按照一定操作顺序进行  申明一个过滤器接口,里面有一个"方法申明" 叫 规则过滤,返回处理后的结果 申明一些具体的操作类,全部实现过滤器接口,重写里头规则过滤的方法,返回规 ...

  9. java哪个软件编程好学吗_java是什么软件好学吗(java编程用哪个软件)

    "工欲善其事必先利其器",想要学好Java编程开发,除了要有好的学习资源之外,还要有一套适合自己的Java编程软件,好的编程软件能极大提高你的学习和工作效率. 那么,Java编程软 ...

最新文章

  1. YOLOP ONNXRuntime C++工程化记录
  2. 视图view没有主键,但可以添加唯一索引
  3. Android常用ui,XUI: 一个简洁而优雅的Android原生UI框架,解放你的双手!
  4. html生成自定义表格,自定义js的表格插件
  5. Android菜单详解(三)——SubMenu和IconMenu
  6. 【C++的深度剖析教程20】类型转换函数上
  7. STM32 - 定时器的设定 - 基础-03 - 输出波形控制 - Output compare mode
  8. TensorFlow tf.keras.callbacks.EarlyStopping
  9. textarea中输入多个空格或者换行时只显示一个空格的解决办法
  10. 一步一步asp.net_三层构架总结
  11. Oracle磁带机扩容方案,IBM TS3500带库磁带机扩容方案.doc
  12. swf转换为GIF格式
  13. LocalDateTime日期格式之间的转换
  14. java生成有理数_Java 有理数设计
  15. 《谁说菜鸟不会数据分析》数据处理 之 数据清洗--重复数据的处理
  16. Unity鼠标事件详解
  17. Win7下面安装VS2003
  18. 微信小程序调用扫一扫
  19. mysql sql tuning_使用SQL tuning advisor(STA)自动优化SQL
  20. makefile文件解释

热门文章

  1. 三、synchronized同步锁
  2. 一个工具类实现自定义Tablayout的下划线宽度
  3. 从安装、管理到防御,阿里云安骑士全向测评
  4. web安全的学习路线
  5. php底层开发框架, yaf,swoole,hiphop
  6. java编译器源码详解_已更新至第8章 | LLVM 编译框架详解
  7. 《Python数据可视化编程实战》—— 1.2 安装matplotlib、Numpy和Scipy库
  8. sap采购申请自动转采购订单_SAP idoc功能够强大: 采购订单修改自动触发销售订单修改...
  9. mysql单库tps_简单计算mysql 的QPS,TPS
  10. 从零开始学ios开发(十四):Navigation Controllers and Table Views(上)