首页 > 代码库 > 微信公众平台开发(5)-上传下载多媒体文件

微信公众平台开发(5)-上传下载多媒体文件

回复图片、音频、视频消息都是需要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 = http://www.mamicode.com/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;    }}

微信公众平台开发(5)-上传下载多媒体文件