com.foxinmy.weixin4j.mp.api.MediaApi Maven / Gradle / Ivy
package com.foxinmy.weixin4j.mp.api;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.entity.mime.content.ByteArrayBody;
import org.apache.http.entity.mime.content.StringBody;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.alibaba.fastjson.parser.deserializer.ExtraProcessor;
import com.foxinmy.weixin4j.exception.WeixinException;
import com.foxinmy.weixin4j.http.JsonResult;
import com.foxinmy.weixin4j.http.PartParameter;
import com.foxinmy.weixin4j.http.Response;
import com.foxinmy.weixin4j.model.Consts;
import com.foxinmy.weixin4j.model.Token;
import com.foxinmy.weixin4j.mp.model.MediaCounter;
import com.foxinmy.weixin4j.mp.model.MediaItem;
import com.foxinmy.weixin4j.mp.model.MediaRecord;
import com.foxinmy.weixin4j.msg.model.MpArticle;
import com.foxinmy.weixin4j.token.TokenHolder;
import com.foxinmy.weixin4j.type.MediaType;
import com.foxinmy.weixin4j.util.ConfigUtil;
import com.foxinmy.weixin4j.util.FileUtil;
import com.foxinmy.weixin4j.util.IOUtil;
/**
* 素材相关API
*
* @className MediaApi
* @author jy.hu
* @date 2014年9月25日
* @since JDK 1.7
* @see com.foxinmy.weixin4j.type.MediaType
*/
public class MediaApi extends MpApi {
private final TokenHolder tokenHolder;
public MediaApi(TokenHolder tokenHolder) {
this.tokenHolder = tokenHolder;
}
/**
* 上传媒体文件
*
* @param file
* 文件对象
* @param isMaterial
* 是否永久上传
* @return 上传到微信服务器返回的媒体标识
* @see {@link com.foxinmy.weixin4j.mp.api.MediaApi#uploadMedia(File, MediaType)}
* @throws WeixinException
* @throws IOException
*/
public String uploadMedia(File file, boolean isMaterial)
throws WeixinException, IOException {
String mediaTypeKey = IOUtil.getExtension(file.getName());
if (StringUtils.isBlank(mediaTypeKey)) {
mediaTypeKey = FileUtil.getFileType(file);
}
MediaType mediaType = MediaType.getMediaType(mediaTypeKey);
return uploadMedia(file, mediaType, isMaterial);
}
/**
* 上传媒体文件 此接口只包含图片、语音、缩略图三种媒体类型的上传
*
* @param file
* 文件对象
* @param mediaType
* 媒体类型 (image)、语音(voice)和缩略图(thumb)
* @param isMaterial
* 是否永久上传
* @return 上传到微信服务器返回的媒体标识
* @throws WeixinException
* @see com.foxinmy.weixin4j.type.MediaType
* @see {@link com.foxinmy.weixin4j.mp.api.MediaApi#uploadMedia(String, byte[],String,boolean)}
*/
public String uploadMedia(File file, MediaType mediaType, boolean isMaterial)
throws WeixinException, IOException {
byte[] datas = IOUtil.toByteArray(new FileInputStream(file));
return uploadMedia(file.getName(), datas, mediaType.name(), isMaterial);
}
/**
* 上传媒体文件 此接口只包含图片、语音、缩略图、视频(临时)四种媒体类型的上传
*
* 正常情况下返回{"type":"TYPE","media_id":"MEDIA_ID","created_at":123456789},
* 否则抛出异常.
*
*
* @param fileName
* 文件名
* @param bytes
* 媒体数据包
* @param mediaType
* 媒体文件类型:分别有图片(image)、语音(voice)、视频(video)和缩略图(thumb)
* @param isMaterial
* 是否永久上传
* @return 上传到微信服务器返回的媒体标识
* @see 上传临时素材
* @see 上传永久素材
* @throws WeixinException
*/
public String uploadMedia(String fileName, byte[] bytes, String mediaType,
boolean isMaterial) throws WeixinException {
if (",image,voice,video,thumb,".indexOf(String
.format(",%s,", mediaType)) < 0) {
throw new WeixinException(String.format(
"unsupported media type:%s", mediaType));
}
if (mediaType.equals(MediaType.video.name()) && isMaterial) {
throw new WeixinException(
"please invoke uploadMaterialVideo method");
}
Token token = tokenHolder.getToken();
Response response = null;
if (isMaterial) {
String material_media_upload_uri = getRequestUri("material_media_upload_uri");
try {
response = request.post(String.format(
material_media_upload_uri, token.getAccessToken()),
new PartParameter("media", new ByteArrayBody(bytes,
fileName)), new PartParameter("type",
new StringBody(mediaType, Consts.UTF_8)));
} catch (UnsupportedEncodingException e) {
; // ignore
}
} else {
String file_upload_uri = getRequestUri("file_upload_uri");
response = request.post(String.format(file_upload_uri,
token.getAccessToken(), mediaType), new PartParameter(
"media", new ByteArrayBody(bytes, fileName)));
}
return response.getAsJson().getString("media_id");
}
/**
* 下载媒体素材
*
* 正常情况下返回表头如Content-Type: image/jpeg,否则抛出异常.
*
*
* @param mediaId
* 存储在微信服务器上的媒体标识
* @param mediaType
* 媒体文件类型:分别有图片(image)、语音(voice)、视频(video)和缩略图(thumb)
* @return 写入硬盘后的文件对象
* @throws WeixinException
* @see 下载临时媒体文件
* @see 下载永久媒体素材
* @see com.foxinmy.weixin4j.type.MediaType
* @see {@link com.foxinmy.weixin4j.mp.api.MediaApi#downloadMedia(String,boolean)}
*/
public File downloadMedia(String mediaId, MediaType mediaType,
boolean isMaterial) throws WeixinException {
if (",image,voice,video,thumb,".indexOf(String.format(",%s,",
mediaType.name())) < 0) {
throw new WeixinException(String.format(
"unsupported media type:%s", mediaType.name()));
}
String media_path = ConfigUtil.getValue("media_path");
File file = new File(media_path + File.separator + mediaId + "."
+ mediaType.getFormatName());
if (file.exists()) {
return file;
}
byte[] datas = downloadMedia(mediaId, isMaterial);
OutputStream os = null;
try {
if (file.createNewFile()) {
os = new FileOutputStream(file);
os.write(datas);
} else {
throw new WeixinException(String.format("create file fail:%s",
file.getAbsolutePath()));
}
} catch (IOException e) {
throw new WeixinException(e.getMessage());
} finally {
try {
if (os != null) {
os.close();
}
} catch (IOException ignore) {
;
}
}
return file;
}
/**
* 下载媒体素材
*
* @param mediaId
* 媒体ID
* @param isMaterial
* 是否下载永久素材
* @return 二进制数据包
* @throws WeixinException
* @see 下载临时媒体素材
* @see 下载永久媒体素材
*/
public byte[] downloadMedia(String mediaId, boolean isMaterial)
throws WeixinException {
Token token = tokenHolder.getToken();
Response response = null;
if (isMaterial) {
JSONObject media = new JSONObject();
media.put("media_id", mediaId);
String material_media_download_uri = getRequestUri("material_media_download_uri");
response = request.post(
String.format(material_media_download_uri,
token.getAccessToken()), media.toJSONString());
} else {
String file_download_uri = getRequestUri("file_download_uri");
response = request.get(String.format(file_download_uri,
token.getAccessToken(), mediaId));
}
return response.getBody();
}
/**
* 上传永久图文素材
*
* 、新增的永久素材也可以在公众平台官网素材管理模块中看到,永久素材的数量是有上限的,请谨慎新增。图文消息素材和图片素材的上限为5000,
* 其他类型为1000
*
*
* @param articles
* 图文列表
* @return 上传到微信服务器返回的媒体标识
* @throws WeixinException
* @see 上传永久媒体素材
* @see com.foxinmy.weixin4j.msg.model.MpArticle
*/
public String uploadMaterialArticle(List articles)
throws WeixinException {
Token token = tokenHolder.getToken();
String material_article_upload_uri = getRequestUri("material_article_upload_uri");
JSONObject obj = new JSONObject();
obj.put("articles", articles);
Response response = request.post(
String.format(material_article_upload_uri,
token.getAccessToken()), obj.toJSONString());
return response.getAsJson().getString("media_id");
}
/**
* 下载永久图文素材
*
* @param mediaId
* 媒体ID
* @return 图文列表
* @throws WeixinException
* @see 下载永久媒体素材
* @see com.foxinmy.weixin4j.msg.model.MpArticle
*/
public List downloadArticle(String mediaId)
throws WeixinException {
byte[] bytes = downloadMedia(mediaId, true);
JSONObject obj = JSON.parseObject(bytes, 0, bytes.length,
Consts.UTF_8.newDecoder(), JSONObject.class);
return JSON.parseArray(obj.getString("news_item"), MpArticle.class);
}
/**
* 更新永久图文素材
*
* @param mediaId
* 要修改的图文消息的id
* @param index
* 要更新的文章在图文消息中的位置(多图文消息时,此字段才有意义),第一篇为0
* @param articles
* 图文列表
* @return 处理结果
* @throws WeixinException
* @see com.foxinmy.weixin4j.msg.model.MpArticle
* @see 更新永久图文素材
*/
public JsonResult updateMaterialArticle(String mediaId, int index,
List articles) throws WeixinException {
Token token = tokenHolder.getToken();
String material_article_update_uri = getRequestUri("material_article_update_uri");
JSONObject obj = new JSONObject();
obj.put("articles", articles);
obj.put("media_id", mediaId);
obj.put("index", index);
Response response = request.post(
String.format(material_article_update_uri,
token.getAccessToken()), obj.toJSONString());
return response.getAsJsonResult();
}
/**
* 删除永久媒体素材
*
* @param mediaId
* 媒体素材的media_id
* @return 处理结果
* @throws WeixinException
* @see 删除永久媒体素材
*/
public JsonResult deleteMaterialMedia(String mediaId)
throws WeixinException {
Token token = tokenHolder.getToken();
String material_media_del_uri = getRequestUri("material_media_del_uri");
JSONObject obj = new JSONObject();
obj.put("media_id", mediaId);
Response response = request.post(
String.format(material_media_del_uri, token.getAccessToken()),
obj.toJSONString());
return response.getAsJsonResult();
}
/**
* 上传永久视频素材
*
* @param file
* 大小不超过1M且格式为MP4的视频文件
* @param title
* 视频标题
* @param introduction
* 视频描述
* @return 上传到微信服务器返回的媒体标识
* @see 上传永久媒体素材
* @throws WeixinException
* @throws IOException
*/
public String uploadMaterialVideo(File file, String title,
String introduction) throws WeixinException, IOException {
String material_media_upload_uri = getRequestUri("material_media_upload_uri");
Token token = tokenHolder.getToken();
try {
JSONObject description = new JSONObject();
description.put("title", title);
description.put("introduction", introduction);
byte[] bytes = IOUtil.toByteArray(new FileInputStream(file));
Response response = request.post(
String.format(material_media_upload_uri,
token.getAccessToken()),
new PartParameter("media", new ByteArrayBody(bytes, file
.getName())),
new PartParameter("type", new StringBody(MediaType.video
.name(), Consts.UTF_8)),
new PartParameter("description", new StringBody(description
.toJSONString(), Consts.UTF_8)));
return response.getAsJson().getString("media_id");
} catch (UnsupportedEncodingException e) {
throw new WeixinException("unsupported encoding");
}
}
/**
* 获取永久媒体素材的总数 .图片和图文消息素材(包括单图文和多图文)的总数上限为5000,其他素材的总数上限为1000
*
* @return 总数对象
* @throws WeixinException
* @see com.foxinmy.weixin4j.mp.model.MediaCounter
* @see 获取素材总数
*/
public MediaCounter countMaterialMedia() throws WeixinException {
Token token = tokenHolder.getToken();
String material_media_count_uri = getRequestUri("material_media_count_uri");
Response response = request.get(String.format(material_media_count_uri,
token.getAccessToken()));
return response.getAsObject(new TypeReference() {
});
}
/**
* 获取媒体素材记录列表
*
* @param mediaType
* 素材的类型,图片(image)、视频(video)、语音 (voice)、图文(news)
* @param offset
* 从全部素材的该偏移位置开始返回,0表示从第一个素材返回
* @param count
* 返回素材的数量,取值在1到20之间
* @return 媒体素材的记录对象
* @throws WeixinException
* @see com.foxinmy.weixin4j.mp.model.MediaRecord
* @see com.foxinmy.weixin4j.type.MediaType
* @see com.foxinmy.weixin4j.mp.model.MediaItem
* @see 获取素材列表
*/
public MediaRecord listMaterialMedia(MediaType mediaType, int offset,
int count) throws WeixinException {
Token token = tokenHolder.getToken();
String material_media_list_uri = getRequestUri("material_media_list_uri");
JSONObject obj = new JSONObject();
obj.put("type", mediaType.name());
obj.put("offset", offset);
obj.put("count", count);
Response response = request.post(
String.format(material_media_list_uri, token.getAccessToken()),
obj.toJSONString());
MediaRecord mediaRecord = null;
if (mediaType == MediaType.news) {
mediaRecord = JSON.parseObject(response.getAsString(), MediaRecord.class,
new ExtraProcessor() {
@Override
public void processExtra(Object object, String key,
Object value) {
if (key.equals("content")) {
((MediaItem) object).setArticles(JSON
.parseArray(((JSONObject) value)
.getString("news_item"),
MpArticle.class));
}
}
});
} else {
mediaRecord = response
.getAsObject(new TypeReference() {
});
}
mediaRecord.setMediaType(mediaType);
return mediaRecord;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy