回复图片、音频、视频消息都是需要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;
}
}
以上就是java微信开发之上传下载多媒体文件的详细内容。