java微信开发之上传下载多媒体文件
来源: 阅读:3135 次 日期:2016-08-16 15:35:56
温馨提示: 小编为您整理了“java微信开发之上传下载多媒体文件”,方便广大网友查阅!

这篇文章主要为大家详细介绍了java微信开发之简单实现上传下载多媒体文件的相关资料,感兴趣的小伙伴们可以参考一下

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

上传下载多媒体文件的方法还是写到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;

 }

}

以上就是本文的全部内容,希望对大家的学习有所帮助

更多信息请查看网络编程
由于各方面情况的不断调整与变化, 提供的所有考试信息和咨询回复仅供参考,敬请考生以权威部门公布的正式信息和咨询为准!

2025国考·省考课程试听报名

  • 报班类型
  • 姓名
  • 手机号
  • 验证码
关于我们 | 联系我们 | 人才招聘 | 网站声明 | 网站帮助 | 非正式的简要咨询 | 简要咨询须知 | 加入群交流 | 手机站点 | 投诉建议
工业和信息化部备案号:滇ICP备2023014141号-1 云南省教育厅备案号:云教ICP备0901021 滇公网安备53010202001879号 人力资源服务许可证:(云)人服证字(2023)第0102001523号
云南网警备案专用图标
联系电话:0871-65317125(9:00—18:00) 获取招聘考试信息及咨询关注公众号:hfpxwx
咨询QQ:526150442(9:00—18:00)版权所有:
云南网警报警专用图标
Baidu
map