java微信開發之上傳下載多媒體檔案_php執行個體

來源:互聯網
上載者:User

回複圖片、音頻、影像訊息都是需要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; }}

以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支援雲棲社區。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.