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

前端技术 2023/09/02 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;
 }
}

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

本文地址:https://www.stayed.cn/item/3654

转载请注明出处。

本站部分内容来源于网络,如侵犯到您的权益,请 联系我

我的博客

人生若只如初见,何事秋风悲画扇。