java开发微信订阅号群发功能(三)
上篇完成了群发消息的文本群发
但是文本字数有限制,所以就需要功能更加强大的群发图文消息
群发文本消息需要上传素材之后获取media_id。
微信官方提供了两个上传素材的接口
一个是永久素材文件的上传如下
接口链接:`
https://api.weixin.qq.com/cgi-bin/material/add_news?access_token=ACCESS_TOKEN
一个是零时文件上传接口如下
注意这个素材上传只能上传零时的
上传示例
@RequestMapping("/uploadFile")
@ResponseBody
public Map<String, Object > uploadFile(String type) throws Exception {
//获取access_token
Map<String, String> stringMap = this.getToken();
String accessToken = stringMap.get("access_token");
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String realPath = request.getSession().getServletContext().getRealPath("/");
String fileUrl= realPath+"/images/zmDistributor.jpg";
System.out.println(realPath);
//指定文件路劲,
File file=new File(fileUrl);
// File file=new File("D:\\images\\7d5139bcd8fdd73245a2b5d7bbd7bb19.jpg");
//如果文件类型没有指定,则默认为图片
if("".equals(type)||type==null){
type = "image";
}
//文件上传路劲
String url = " https://api.weixin.qq.com/cgi-bin/media/upload?access_token="
+ accessToken + "&type="+type;
/* (永久素材上传路径,如需要上传永久素材,直接换路径)
String url = "https://api.weixin.qq.com/cgi-bin/material/add_material?access_token="+ access_token + "&type=" + type;
*/
String title ="";
String introduction="";
String result = null;
try {
//设置请求参数
URL uploadURL = new URL(url);
HttpURLConnection conn = (HttpURLConnection) uploadURL.openConnection();
conn.setConnectTimeout(5000);
conn.setReadTimeout(30000);
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setUseCaches(false);
conn.setRequestMethod("POST");
conn.setRequestProperty("Connection", "Keep-Alive");
conn.setRequestProperty("Cache-Control", "no-cache");
String boundary = "-----------------------------" + System.currentTimeMillis();
conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
//对文件进行读写
OutputStream output = conn.getOutputStream();
output.write(("--" + boundary + "\r\n").getBytes());
output.write(String.format("Content-Disposition: form-data; name=\"media\"; filename=\"%s\"\r\n", file.getName()).getBytes());
output.write("Content-Type: video/mp4 \r\n\r\n".getBytes());
byte[] data = new byte[1024];
int len = 0;
FileInputStream input = new FileInputStream(file);
while ((len = input.read(data)) > -1) {
output.write(data, 0, len);
}
/*对类型为video的素材进行特殊处理*/
if ("video".equals(type)) {
output.write(("--" + boundary + "\r\n").getBytes());
output.write("Content-Disposition: form-data; name=\"description\";\r\n\r\n".getBytes());
output.write(String.format("{\"title\":\"%s\", \"introduction\":\"%s\"}", title, introduction).getBytes());
}
output.write(("\r\n--" + boundary + "--\r\n\r\n").getBytes());
output.flush();
output.close();
input.close();
InputStream resp = conn.getInputStream();
StringBuffer sb = new StringBuffer();
while ((len = resp.read(data)) > -1)
sb.append(new String(data, 0, len, "utf-8"));
resp.close();
result = sb.toString();
} catch (IOException e) {
//....
}
//获取到文件上传的返回值,封装map方便后续使用
JSONObject jsonObject = JSONObject.fromObject(result);
Map<String, Object> map = (Map) jsonObject;
map.put("access_token",accessToken);
map.put("phone",stringMap.get("phone"));
System.out.println(map.toString());
return map;
}
至此文件上传就已经完成了
注意我这里文件是直接读取的本地的某个目录文件,可以自定义,也可以自己上传