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

5年以前  |  阅读数:355 次  |  编程语言:PHP 

回复图片、音频、视频消息都是需要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分页显示制作详细讲解
SSH 登录失败:Host key verification failed
获取IMSI
将二进制数据转为16进制以便显示
获取IMEI
文件下载
贪吃蛇
双位运算符
PHP自定义函数获取搜索引擎来源关键字的方法
Java生成UUID
发送邮件
年的日历图
提取后缀名
在Zeus Web Server中安装PHP语言支持
让你成为最历害的git提交人
Yii2汉字转拼音类的实例代码
再谈PHP中单双引号的区别详解
指定应用ID以获取对应的应用名称
Python 2与Python 3版本和编码的对比
php封装的page分页类完整实例