All Downloads are FREE. Search and download functionalities are using the official Maven repository.

me.hao0.wechat.core.Materials Maven / Gradle / Ivy

The newest version!
package me.hao0.wechat.core;

import com.fasterxml.jackson.databind.JavaType;
import com.google.common.collect.Maps;
import me.hao0.common.http.Http;
import me.hao0.common.json.Jsons;
import me.hao0.common.model.Page;
import me.hao0.wechat.exception.WechatException;
import me.hao0.wechat.model.material.CommonMaterial;
import me.hao0.wechat.model.material.MaterialCount;
import me.hao0.wechat.model.material.MaterialType;
import me.hao0.wechat.model.material.MaterialUploadType;
import me.hao0.wechat.model.material.NewsContentItem;
import me.hao0.wechat.model.material.NewsMaterial;
import me.hao0.wechat.model.material.PermMaterial;
import me.hao0.wechat.model.material.TempMaterial;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import static me.hao0.common.util.Preconditions.*;

/**
 * 素材组件
 * Author: haolin
 * Email: [email protected]
 * Date: 18/11/15
 * @since 1.4.0
 */
public final class Materials extends Component {

    /**
     * 素材总数
     */
    private static final String COUNT = "https://api.weixin.qq.com/cgi-bin/material/get_materialcount?access_token=";

    /**
     * 素材列表
     */
    private static final String GETS = "https://api.weixin.qq.com/cgi-bin/material/batchget_material?access_token=";

    /**
     * 删除永久素材
     */
    private static final String DELETE = "https://api.weixin.qq.com/cgi-bin/material/del_material?access_token=";

    /**
     * 临时素材上传
     */
    private static final String UPLOAD_TEMP = "https://api.weixin.qq.com/cgi-bin/media/upload?access_token=";

    /**
     * 临时素材下载
     */
    private static final String DOWNLOAD_TEMP = "https://api.weixin.qq.com/cgi-bin/media/get?access_token=";

    /**
     * 添加永久图文素材
     */
    private static final String ADD_NEWS = "https://api.weixin.qq.com/cgi-bin/material/add_news?access_token=";

    /**
     * 更新永久图文素材
     */
    private static final String UPDATE_NEWS = "https://api.weixin.qq.com/cgi-bin/material/update_news?access_token=";

    /**
     * 上传永久图文素材内容中引用的图片
     */
    private static final String UPLOAD_NEWS_IMAGE = "https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token=";

    /**
     * 上传永久素材(图片,语音,视频)
     */
    private static final String UPLOAD_PERM = "https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=";

    private static final JavaType ARRAY_LIST_COMMON_MATERIAL_TYPE = Jsons.DEFAULT.createCollectionType(ArrayList.class, CommonMaterial.class);

    private static final JavaType ARRAY_LIST_NEWS_MATERIAL_TYPE = Jsons.DEFAULT.createCollectionType(ArrayList.class, NewsMaterial.class);

    Materials(){}

    /**
     * 获取素材总数统计
     * @return 素材总数统计
     */
    public MaterialCount count(){
        return count(loadAccessToken());
    }

    /**
     * 获取素材总数统计
     * @param cb 回调
     */
    public void count(Callback cb){
        count(loadAccessToken(), cb);
    }

    /**
     * 获取素材总数统计
     * @param accessToken accessToken
     * @param cb 回调
     */
    public void count(final String accessToken, Callback cb){
        doAsync(new AsyncFunction(cb) {
            @Override
            public MaterialCount execute() {
                return count(accessToken);
            }
        });
    }

    /**
     * 获取素材总数统计
     * @param accessToken accessToken
     * @return 素材总数统计,或抛WechatException
     */
    public MaterialCount count(String accessToken){
        checkNotNullAndEmpty(accessToken, "accessToken");
        String url = COUNT + accessToken;
        Map resp = doGet(url);
        return Jsons.DEFAULT.fromJson(Jsons.DEFAULT.toJson(resp), MaterialCount.class);
    }

    /**
     * 获取素材列表
     * @param type 素材类型
     * @param offset 从全部素材的该偏移位置开始返回,0表示从第一个素材返回
     * @param count 返回素材的数量,取值在1到20之间
     * @param  Material范型
     * @return 素材分页对象,或抛WechatException
     */
    public  Page gets(MaterialType type, Integer offset, Integer count){
        return gets(loadAccessToken(), type, offset, count);
    }

    /**
     * 获取素材列表
     * @param type 素材类型
     * @param offset 从全部素材的该偏移位置开始返回,0表示从第一个素材返回
     * @param count 返回素材的数量,取值在1到20之间
     * @param  Material范型
     * @param cb 回调
     */
    public  void gets(final MaterialType type, final Integer offset, final Integer count, Callback> cb){
        gets(loadAccessToken(), type, offset, count, cb);
    }

    /**
     * 获取素材列表
     * @param accessToken accessToken
     * @param type 素材类型
     * @param offset 从全部素材的该偏移位置开始返回,0表示从第一个素材返回
     * @param count 返回素材的数量,取值在1到20之间
     * @param  Material范型
     * @param cb 回调
     */
    public  void gets(final String accessToken, final MaterialType type, final Integer offset, final Integer count, Callback> cb){
        doAsync(new AsyncFunction>(cb) {
            @Override
            public Page execute() {
                return gets(accessToken, type, offset, count);
            }
        });
    }

    /**
     * 获取素材列表
     * @param accessToken accessToken
     * @param type 素材类型
     * @param offset 从全部素材的该偏移位置开始返回,0表示从第一个素材返回
     * @param count 返回素材的数量,取值在1到20之间
     * @param  Material范型
     * @return 素材分页对象,或抛WechatException
     */
    public  Page gets(String accessToken, MaterialType type, Integer offset, Integer count){
        checkNotNullAndEmpty(accessToken, "accessToken");
        checkNotNull(type, "material type can't be null");

        String url = GETS + accessToken;
        Map params = Maps.newHashMapWithExpectedSize(3);
        params.put("type", type.value());
        params.put("offset", offset == null ? 0 : offset);
        params.put("count", count == null ? 10 : count);

        Map resp = doPost(url, params);
        return renderMaterialPage(type, resp);
    }

    private  Page renderMaterialPage(MaterialType type, Map resp) {
        Integer itemCount = (Integer)resp.get("item_count");
        if (itemCount == null || itemCount <= 0){
            return Page.empty();
        }

        Integer itemTotal = (Integer)resp.get("total_count");

        JavaType materialType = MaterialType.NEWS == type ?
                ARRAY_LIST_NEWS_MATERIAL_TYPE :ARRAY_LIST_COMMON_MATERIAL_TYPE ;
        List materials = Jsons.DEFAULT.fromJson(
                Jsons.DEFAULT.toJson(resp.get("item")), materialType);

        return new Page<>(Long.valueOf(itemTotal), materials);
    }

    /**
     * 删除永久素材
     * @param mediaId 永久素材mediaId
     * @return 删除成功返回true,或抛WechatException
     */
    public Boolean delete(String mediaId){
        return delete(loadAccessToken(), mediaId);
    }

    /**
     * 删除永久素材
     * @param mediaId 永久素材mediaId
     * @param cb 回调
     */
    public void delete(final String mediaId, Callback cb){
        delete(loadAccessToken(), mediaId, cb);
    }

    /**
     * 删除永久素材
     * @param accessToken accessToken
     * @param mediaId 永久素材mediaId
     * @param cb 回调
     */
    public void delete(final String accessToken, final String mediaId, Callback cb){
        doAsync(new AsyncFunction(cb) {
            @Override
            public Boolean execute() {
                return delete(accessToken, mediaId);
            }
        });
    }

    /**
     * 删除永久素材
     * @param accessToken accessToken
     * @param mediaId 永久素材mediaId
     * @return 删除成功返回true,或抛WechatException
     */
    public Boolean delete(String accessToken, String mediaId){
        checkNotNullAndEmpty(accessToken, "accessToken");
        checkNotNullAndEmpty(mediaId, "mediaId");

        String url = DELETE + accessToken;
        Map params = Maps.newHashMapWithExpectedSize(1);
        params.put("media_id", mediaId);
        doPost(url, params);

        return Boolean.TRUE;
    }

    /**
     * 上传临时素材:
     图片(image): 1M,bmp/png/jpeg/jpg/gif
     语音(voice):2M,播放长度不超过60s,mp3/wma/wav/amr
     视频(video):10MB,支持MP4格式
     缩略图(thumb):64KB,bmp/png/jpeg/jpg/gif
     媒体文件在后台保存时间为3天,即3天后media_id失效。
     * @param type 文件类型
     * @param fileName 文件名
     * @param fileData 文件数据
     * @return TempMaterial对象,或抛WechatException
     */
    public TempMaterial uploadTemp(MaterialUploadType type, String fileName, byte[] fileData) {
        return uploadTemp(loadAccessToken(), type, fileName, new ByteArrayInputStream(fileData));
    }

    /**
     * 上传临时素材:
     图片(image): 1M,bmp/png/jpeg/jpg/gif
     语音(voice):2M,播放长度不超过60s,mp3/wma/wav/amr
     视频(video):10MB,支持MP4格式
     缩略图(thumb):64KB,bmp/png/jpeg/jpg/gif
     媒体文件在后台保存时间为3天,即3天后media_id失效。
     * @param accessToken accessToken
     * @param type 文件类型
     * @param fileName 文件名
     * @param fileData 文件数据
     * @return TempMaterial对象,或抛WechatException
     */
    public TempMaterial uploadTemp(String accessToken, MaterialUploadType type, String fileName, byte[] fileData) {
        return uploadTemp(accessToken, type, fileName, new ByteArrayInputStream(fileData));
    }

    /**
     * 上传临时素材:
     图片(image): 1M,bmp/png/jpeg/jpg/gif
     语音(voice):2M,播放长度不超过60s,mp3/wma/wav/amr
     视频(video):10MB,支持MP4格式
     缩略图(thumb):64KB,bmp/png/jpeg/jpg/gif
     媒体文件在后台保存时间为3天,即3天后media_id失效。
     * @param type 文件类型
     * @param media 媒体文件输入流
     * @return TempMaterial对象,或抛WechatException
     */
    public TempMaterial uploadTemp(MaterialUploadType type, File media) {
        return uploadTemp(loadAccessToken(), type, media);
    }

    /**
     * 上传临时素材:
     图片(image): 1M,bmp/png/jpeg/jpg/gif
     语音(voice):2M,播放长度不超过60s,mp3/wma/wav/amr
     视频(video):10MB,支持MP4格式
     缩略图(thumb):64KB,bmp/png/jpeg/jpg/gif
     媒体文件在后台保存时间为3天,即3天后media_id失效。
     * @param accessToken accessToken
     * @param type 文件类型
     * @param media 媒体文件输入流
     * @return TempMaterial对象,或抛WechatException
     */
    public TempMaterial uploadTemp(String accessToken, MaterialUploadType type, File media) {
        try {
            return uploadTemp(accessToken, type, media.getName(), new FileInputStream(media));
        } catch (FileNotFoundException e) {
            throw new WechatException(e);
        }
    }

    /**
     * 上传临时素材:
     图片(image): 1M,bmp/png/jpeg/jpg/gif
     语音(voice):2M,播放长度不超过60s,mp3/wma/wav/amr
     视频(video):10MB,支持MP4格式
     缩略图(thumb):64KB,bmp/png/jpeg/jpg/gif
     媒体文件在后台保存时间为3天,即3天后media_id失效。
     * @param type 文件类型
     * @param media 媒体文件输入流
     * @param cb 回调
     */
    public void uploadTemp( MaterialUploadType type, File media, Callback cb) {
        try {
            uploadTemp(loadAccessToken(), type, media.getName(), new FileInputStream(media), cb);
        } catch (FileNotFoundException e) {
            throw new WechatException(e);
        }
    }

    /**
     * 上传临时素材:
     图片(image): 1M,bmp/png/jpeg/jpg/gif
     语音(voice):2M,播放长度不超过60s,mp3/wma/wav/amr
     视频(video):10MB,支持MP4格式
     缩略图(thumb):64KB,bmp/png/jpeg/jpg/gif
     媒体文件在后台保存时间为3天,即3天后media_id失效。
     * @param accessToken accessToken
     * @param type 文件类型
     * @param media 媒体文件输入流
     * @param cb 回调
     */
    public void uploadTemp(String accessToken, MaterialUploadType type, File media, Callback cb) {
        try {
            uploadTemp(accessToken, type, media.getName(), new FileInputStream(media), cb);
        } catch (FileNotFoundException e) {
            throw new WechatException(e);
        }
    }

    /**
     * 上传临时素材:
     图片(image): 1M,bmp/png/jpeg/jpg/gif
     语音(voice):2M,播放长度不超过60s,mp3/wma/wav/amr
     视频(video):10MB,支持MP4格式
     缩略图(thumb):64KB,bmp/png/jpeg/jpg/gif
     媒体文件在后台保存时间为3天,即3天后media_id失效。
     * @param type 文件类型
     * @param fileName 文件名
     * @param input 输入流
     * @return TempMaterial对象,或抛WechatException
     */
    public TempMaterial uploadTemp(MaterialUploadType type, String fileName, InputStream input) {
        return uploadTemp(loadAccessToken(), type, fileName, input);
    }

    /**
     * 上传临时素材:
     图片(image): 1M,bmp/png/jpeg/jpg/gif
     语音(voice):2M,播放长度不超过60s,mp3/wma/wav/amr
     视频(video):10MB,支持MP4格式
     缩略图(thumb):64KB,bmp/png/jpeg/jpg/gif
     媒体文件在后台保存时间为3天,即3天后media_id失效。
     * @param type 文件类型
     * @param fileName 文件名
     * @param input 输入流
     * @param cb 回调
     */
    public void uploadTemp(final MaterialUploadType type, final String fileName, final InputStream input, Callback cb) {
        uploadTemp(loadAccessToken(), type, fileName, input, cb);
    }

    /**
     * 上传临时素材:
     图片(image): 1M,bmp/png/jpeg/jpg/gif
     语音(voice):2M,播放长度不超过60s,mp3/wma/wav/amr
     视频(video):10MB,支持MP4格式
     缩略图(thumb):64KB,bmp/png/jpeg/jpg/gif
     媒体文件在后台保存时间为3天,即3天后media_id失效。
     * @param accessToken accessToken
     * @param type 文件类型
     * @param fileName 文件名
     * @param input 输入流
     * @param cb 回调
     */
    public void uploadTemp(final String accessToken, final MaterialUploadType type, final String fileName, final InputStream input, Callback cb) {
        doAsync(new AsyncFunction(cb) {
            @Override
            public TempMaterial execute() {
                return uploadTemp(accessToken, type, fileName, input);
            }
        });
    }

    /**
     * 上传临时素材:
     图片(image): 1M,bmp/png/jpeg/jpg/gif
     语音(voice):2M,播放长度不超过60s,mp3/wma/wav/amr
     视频(video):10MB,支持MP4格式
     缩略图(thumb):64KB,bmp/png/jpeg/jpg/gif
     媒体文件在后台保存时间为3天,即3天后media_id失效。
     * @param accessToken accessToken
     * @param type 文件类型
     * @param fileName 文件名
     * @param input 输入流
     * @return TempMaterial对象,或抛WechatException
     */
    public TempMaterial uploadTemp(String accessToken, MaterialUploadType type, String fileName, InputStream input) {
        checkNotNullAndEmpty(accessToken, "accessToken");
        checkNotNull(type, "material upload type can't be null");
        checkNotNullAndEmpty(fileName, "fileName");
        checkNotNull(input, "input can't be null");

        String url = UPLOAD_TEMP + accessToken;
        Map params = Maps.newHashMapWithExpectedSize(1);
        params.put("type", type.value());

        Map resp = doUpload(url, "media", fileName, input, params);
        return Jsons.DEFAULT.fromJson(Jsons.DEFAULT.toJson(resp), TempMaterial.class);
    }

    /**
     * 下载临时素材
     * @param mediaId mediaId
     * @return 文件二进制数据
     */
    public byte[] downloadTemp(String mediaId){
        return downloadTemp(loadAccessToken(), mediaId);
    }

    /**
     * 下载临时素材
     * @param mediaId mediaId
     * @param cb 回调
     */
    public void downloadTemp(final String mediaId, Callback cb){
        downloadTemp(loadAccessToken(), mediaId, cb);
    }

    /**
     * 下载临时素材
     * @param accessToken accessToken
     * @param mediaId mediaId
     * @param cb 回调
     */
    public void downloadTemp(final String accessToken, final String mediaId, Callback cb){
        doAsync(new AsyncFunction(cb) {
            @Override
            public byte[] execute() {
                return downloadTemp(accessToken, mediaId);
            }
        });
    }

    /**
     * 下载临时素材
     * @param accessToken accessToken
     * @param mediaId mediaId
     * @return 文件二进制数据
     */
    public byte[] downloadTemp(String accessToken, String mediaId){
        checkNotNullAndEmpty(accessToken, "accessToken");
        checkNotNullAndEmpty(mediaId, "mediaId");

        String url = DOWNLOAD_TEMP + accessToken + "&media_id=" + mediaId;
        ByteArrayOutputStream output = new ByteArrayOutputStream(1024);
        Http.download(url, output);

        return output.toByteArray();
    }

    /**
     * 添加永久图文素材
     * @param items 图文素材列表
     * @return mediaId
     */
    public String uploadPermNews(List items){
        return uploadPermNews(loadAccessToken(), items);
    }

    /**
     * 添加永久图文素材(其中内容中的外部图片链接会被过滤,所以需先用uploadPermNewsImage转换为微信内部图片)
     * @param items 图文素材列表
     * @param cb 回调
     */
    public void uploadPermNews(final List items, Callback cb){
        uploadPermNews(loadAccessToken(), items, cb);
    }

    /**
     * 添加永久图文素材(其中内容中的外部图片链接会被过滤,所以需先用uploadPermNewsImage转换为微信内部图片)
     * @param accessToken accessToken
     * @param items 图文素材列表
     * @param cb 回调
     */
    public void uploadPermNews(final String accessToken, final List items, Callback cb){
        doAsync(new AsyncFunction(cb) {
            @Override
            public String execute() {
                return uploadPermNews(accessToken, items);
            }
        });
    }

    /**
     * 添加永久图文素材(其中内容中的外部图片链接会被过滤,所以需先用uploadPermNewsImage转换为微信内部图片)
     * @param accessToken accessToken
     * @param items 图文素材列表
     * @return mediaId
     */
    public String uploadPermNews(String accessToken, List items){
        checkNotNullAndEmpty(accessToken, "accessToken");
        checkNotNullAndEmpty(items, "items");

        String url = ADD_NEWS + accessToken;
        Map params = Maps.newHashMapWithExpectedSize(1);
        params.put("articles", items);
        Map resp = doPost(url, params);
        return (String)resp.get("media_id");
    }

    /**
     * 添加永久图文素材(其中内容中的外部图片链接会被过滤,所以需先用uploadPermNewsImage转换为微信内部图片)
     * @param mediaId 图文mediaId
     * @param itemIndex 对应图文素材中的第几个图文项,从0开始
     * @param newItem 新的图文项
     * @param cb 回调
     */
    public void updatePermNews(final String mediaId, final Integer itemIndex, final NewsContentItem newItem, Callback cb){
        updatePermNews(loadAccessToken(), mediaId, itemIndex, newItem, cb);
    }

    /**
     * 添加永久图文素材(其中内容中的外部图片链接会被过滤,所以需先用uploadPermNewsImage转换为微信内部图片)
     * @param accessToken accessToken
     * @param mediaId 图文mediaId
     * @param itemIndex 对应图文素材中的第几个图文项,从0开始
     * @param newItem 新的图文项
     * @param cb 回调
     */
    public void updatePermNews(final String accessToken, final String mediaId, final Integer itemIndex, final NewsContentItem newItem, Callback cb){
        doAsync(new AsyncFunction(cb) {
            @Override
            public Boolean execute() {
                return updatePermNews(accessToken, mediaId, itemIndex, newItem);
            }
        });
    }

    /**
     * 添加永久图文素材(其中内容中的外部图片链接会被过滤,所以需先用uploadPermNewsImage转换为微信内部图片)
     * @param accessToken accessToken
     * @param mediaId 图文mediaId
     * @param itemIndex 对应图文素材中的第几个图文项,从0开始
     * @param newItem 新的图文项
     * @return 更新成功返回true,反之false
     */
    public Boolean updatePermNews(String accessToken, String mediaId, Integer itemIndex, NewsContentItem newItem){
        checkNotNullAndEmpty(accessToken, "accessToken");
        checkNotNullAndEmpty(mediaId, "mediaId");
        checkArgument(itemIndex != null && itemIndex > 0, "itemIndex can't be null and must > 0");
        checkNotNull(newItem, "newItem can't be null");

        String url = UPDATE_NEWS + accessToken;
        Map params = Maps.newHashMapWithExpectedSize(3);
        params.put("media_id", mediaId);
        params.put("index", itemIndex);
        params.put("articles", newItem);

        doPost(url, params);
        return Boolean.TRUE;
    }

    /**
     * 上传永久图文素材内容中引用的图片
     * @param accessToken accessToken
     * @param image 图片对象
     * @return 微信内部图片链接
     */
    public String uploadPermNewsImage(String accessToken, File image) {
        try {
            return uploadPermNewsImage(accessToken, image.getName(), new FileInputStream(image));
        } catch (FileNotFoundException e) {
            throw new WechatException(e);
        }
    }

    /**
     * 上传永久图文素材内容中引用的图片
     * @param image 图片对象
     * @param cb 回调
     */
    public void uploadPermNewsImage(File image, Callback cb) {
        uploadPermNewsImage(loadAccessToken(), image, cb);
    }

    /**
     * 上传永久图文素材内容中引用的图片
     * @param accessToken accessToken
     * @param image 图片对象
     * @param cb 回调
     */
    public void uploadPermNewsImage(String accessToken, File image, Callback cb) {
        try {
            uploadPermNewsImage(accessToken, image.getName(), new FileInputStream(image), cb);
        } catch (FileNotFoundException e) {
            throw new WechatException(e);
        }
    }

    /**
     * 上传永久图文素材内容中引用的图片
     * @param accessToken accessToken
     * @param fileName 文件名
     * @param data 文件二机制数据
     * @return 微信内部图片链接
     */
    public String uploadPermNewsImage(String accessToken, String fileName, byte[] data) {
        return uploadPermNewsImage(accessToken, fileName, new ByteArrayInputStream(data));
    }

    /**
     * 上传永久图文素材内容中引用的图片
     * @param fileName 文件名
     * @param data 文件二机制数据
     * @param cb 回调
     */
    public void uploadPermNewsImage(String fileName, byte[] data, Callback cb) {
        uploadPermNewsImage(loadAccessToken(), fileName, new ByteArrayInputStream(data), cb);
    }

    /**
     * 上传永久图文素材内容中引用的图片
     * @param accessToken accessToken
     * @param fileName 文件名
     * @param data 文件二机制数据
     * @param cb 回调
     */
    public void uploadPermNewsImage(String accessToken, String fileName, byte[] data, Callback cb) {
        uploadPermNewsImage(accessToken, fileName, new ByteArrayInputStream(data), cb);
    }

    /**
     * 上传永久图文素材内容中引用的图片
     * @param fileName 文件名
     * @param in 文件输入流
     * @param cb 回调
     */
    public void uploadPermNewsImage(final String fileName, final InputStream in, Callback cb){
        uploadPermNewsImage(loadAccessToken(), fileName, in, cb);
    }

    /**
     * 上传永久图文素材内容中引用的图片
     * @param accessToken accessToken
     * @param fileName 文件名
     * @param in 文件输入流
     * @param cb 回调
     */
    public void uploadPermNewsImage(final String accessToken, final String fileName, final InputStream in, Callback cb) {
        doAsync(new AsyncFunction(cb) {
            @Override
            public String execute() throws FileNotFoundException {
                return uploadPermNewsImage(accessToken, fileName, in);
            }
        });
    }

    /**
     * 上传永久图文素材内容中引用的图片
     * @param accessToken accessToken
     * @param fileName 文件名
     * @param in 文件输入流
     * @return 微信内部图片链接
     */
    public String uploadPermNewsImage(String accessToken, String fileName, InputStream in) {
        checkNotNullAndEmpty(accessToken, "accessToken");
        checkNotNullAndEmpty(fileName, "fileName");
        checkNotNull(in, "input can't be null");

        String url = UPLOAD_NEWS_IMAGE + accessToken;
        Map resp = doUpload(url, "media", fileName, in, Collections.emptyMap());
        return (String)resp.get("url");
    }

    /**
     * 上传永久(图片,语音,缩略图)素材
     永久素材的数量是有上限的,请谨慎新增。图文消息素材和图片素材的上限为5000,其他类型为1000
     图片(image): 1M,bmp/png/jpeg/jpg/gif
     语音(voice):2M,播放长度不超过60s,mp3/wma/wav/amr
     缩略图(thumb):64KB,bmp/png/jpeg/jpg/gif
     * @param accessToken accessToken
     * @param type 文件类型
     * @param file 文件
     * @return PermMaterial对象,或抛WechatException
     */
    public PermMaterial uploadPerm(String accessToken, MaterialUploadType type, File file) {
        try {
            return uploadPerm(accessToken, type, file.getName(), new FileInputStream(file));
        } catch (FileNotFoundException e) {
            throw new WechatException(e);
        }
    }

    /**
     * 上传永久(图片,语音,缩略图)素材
     永久素材的数量是有上限的,请谨慎新增。图文消息素材和图片素材的上限为5000,其他类型为1000
     图片(image): 1M,bmp/png/jpeg/jpg/gif
     语音(voice):2M,播放长度不超过60s,mp3/wma/wav/amr
     缩略图(thumb):64KB,bmp/png/jpeg/jpg/gif
     * @param accessToken accessToken
     * @param type 文件类型
     * @param fileName 文件名
     * @param data 文件二进制数据
     * @return PermMaterial对象,或抛WechatException
     */
    public PermMaterial uploadPerm(String accessToken, MaterialUploadType type, String fileName, byte[] data) {
        return uploadPerm(accessToken, type, fileName, new ByteArrayInputStream(data));
    }

    /**
     * 上传永久(图片,语音,缩略图)素材
     永久素材的数量是有上限的,请谨慎新增。图文消息素材和图片素材的上限为5000,其他类型为1000
     图片(image): 1M,bmp/png/jpeg/jpg/gif
     语音(voice):2M,播放长度不超过60s,mp3/wma/wav/amr
     缩略图(thumb):64KB,bmp/png/jpeg/jpg/gif
     * @param accessToken accessToken
     * @param type 文件类型
     * @param fileName 文件名
     * @param data 文件二进制数据
     * @param cb 回调
     */
    public void uploadPerm(String accessToken, MaterialUploadType type, String fileName, byte[] data, Callback cb) {
        uploadPerm(accessToken, type, fileName, new ByteArrayInputStream(data), cb);
    }

    /**
     * 上传永久(图片,语音,缩略图)素材
     永久素材的数量是有上限的,请谨慎新增。图文消息素材和图片素材的上限为5000,其他类型为1000
     图片(image): 1M,bmp/png/jpeg/jpg/gif
     语音(voice):2M,播放长度不超过60s,mp3/wma/wav/amr
     缩略图(thumb):64KB,bmp/png/jpeg/jpg/gif
     * @param type 文件类型
     * @param fileName 文件名
     * @param data 文件二进制数据
     * @param cb 回调
     */
    public void uploadPerm(MaterialUploadType type, String fileName, byte[] data, Callback cb) {
        uploadPerm(loadAccessToken(), type, fileName, new ByteArrayInputStream(data), cb);
    }

    /**
     * 上传永久(图片,语音,缩略图)素材
     永久素材的数量是有上限的,请谨慎新增。图文消息素材和图片素材的上限为5000,其他类型为1000
     图片(image): 1M,bmp/png/jpeg/jpg/gif
     语音(voice):2M,播放长度不超过60s,mp3/wma/wav/amr
     缩略图(thumb):64KB,bmp/png/jpeg/jpg/gif
     * @param type 文件类型
     * @param fileName 文件名
     * @param data 文件二进制数据
     * @return PermMaterial对象,或抛WechatException
     */
    public PermMaterial uploadPerm( MaterialUploadType type, String fileName, byte[] data) {
        return uploadPerm(loadAccessToken(), type, fileName, new ByteArrayInputStream(data));
    }

    /**
     * 上传永久(图片,语音,缩略图)素材
     永久素材的数量是有上限的,请谨慎新增。图文消息素材和图片素材的上限为5000,其他类型为1000
     图片(image): 1M,bmp/png/jpeg/jpg/gif
     语音(voice):2M,播放长度不超过60s,mp3/wma/wav/amr
     缩略图(thumb):64KB,bmp/png/jpeg/jpg/gif
     * @param type 文件类型
     * @param file 输入流
     * @param cb 回调
     */
    public void uploadPerm(final MaterialUploadType type, final File file, Callback cb) {
        uploadPerm(loadAccessToken(), type, file, cb);
    }

    /**
     * 上传永久(图片,语音,缩略图)素材
     永久素材的数量是有上限的,请谨慎新增。图文消息素材和图片素材的上限为5000,其他类型为1000
     图片(image): 1M,bmp/png/jpeg/jpg/gif
     语音(voice):2M,播放长度不超过60s,mp3/wma/wav/amr
     缩略图(thumb):64KB,bmp/png/jpeg/jpg/gif
     * @param accessToken accessToken
     * @param type 文件类型
     * @param file 输入流
     * @param cb 回调
     */
    public void uploadPerm(String accessToken, final MaterialUploadType type, final File file, Callback cb) {
        try {
            uploadPerm(accessToken, type, file.getName(), new FileInputStream(file), cb);
        } catch (FileNotFoundException e) {
            throw new WechatException(e);
        }
    }

    /**
     * 上传永久(图片,语音,缩略图)素材
     永久素材的数量是有上限的,请谨慎新增。图文消息素材和图片素材的上限为5000,其他类型为1000
     图片(image): 1M,bmp/png/jpeg/jpg/gif
     语音(voice):2M,播放长度不超过60s,mp3/wma/wav/amr
     缩略图(thumb):64KB,bmp/png/jpeg/jpg/gif
     * @param type 文件类型
     * @param fileName 文件名
     * @param input 输入流
     * @param cb 回调
     */
    public void uploadPerm(final MaterialUploadType type, final String fileName, final InputStream input, Callback cb) {
        uploadPerm(loadAccessToken(), type, fileName, input, cb);
    }

    /**
     * 上传永久(图片,语音,缩略图)素材
     永久素材的数量是有上限的,请谨慎新增。图文消息素材和图片素材的上限为5000,其他类型为1000
     图片(image): 1M,bmp/png/jpeg/jpg/gif
     语音(voice):2M,播放长度不超过60s,mp3/wma/wav/amr
     缩略图(thumb):64KB,bmp/png/jpeg/jpg/gif
     * @param accessToken accessToken
     * @param type 文件类型
     * @param fileName 文件名
     * @param input 输入流
     * @param cb 回调
     */
    public void uploadPerm(final String accessToken, final MaterialUploadType type, final String fileName, final InputStream input, Callback cb) {
        doAsync(new AsyncFunction(cb) {
            @Override
            public PermMaterial execute() throws Exception {
                return uploadPerm(accessToken, type, fileName, input);
            }
        });
    }

    /**
     * 上传永久(图片,语音,缩略图)素材
     永久素材的数量是有上限的,请谨慎新增。图文消息素材和图片素材的上限为5000,其他类型为1000
     图片(image): 1M,bmp/png/jpeg/jpg/gif
     语音(voice):2M,播放长度不超过60s,mp3/wma/wav/amr
     缩略图(thumb):64KB,bmp/png/jpeg/jpg/gif
     * @param accessToken accessToken
     * @param type 文件类型
     * @param fileName 文件名
     * @param input 输入流
     * @return PermMaterial对象,或抛WechatException
     */
    public PermMaterial uploadPerm(String accessToken, MaterialUploadType type, String fileName, InputStream input) {
        checkNotNullAndEmpty(accessToken, "accessToken");
        checkNotNull(type, "material upload type can't be null");
        checkNotNullAndEmpty(fileName, "fileName");
        checkNotNull(input, "input can't be null");
        if (MaterialUploadType.VIDEO == type){
            throw new IllegalArgumentException("type must be image, voice, or thumb, you should use uploadPermVideo method.");
        }

        String url = UPLOAD_PERM + accessToken;
        Map params = Maps.newHashMapWithExpectedSize(1);
        params.put("type", type.value());

        Map resp = doUpload(url, "media", fileName, input, params);
        return Jsons.DEFAULT.fromJson(Jsons.DEFAULT.toJson(resp), PermMaterial.class);
    }

    /**
     * 上传永久视频素材(10M大小)
     * @param accessToken accessToken
     * @param video 视频文件
     * @param title 标题
     * @param desc 描述
     * @return PermMaterial对象,或抛WechatException
     */
    public PermMaterial uploadPermVideo(String accessToken, File video, String title, String desc) {
        try {
            return uploadPermVideo(accessToken, video.getName(), new FileInputStream(video), title, desc);
        } catch (FileNotFoundException e) {
            throw new WechatException(e);
        }
    }

    /**
     * 上传永久视频素材(10M大小)
     * @param video 视频文件
     * @param title 标题
     * @param desc 描述
     * @return PermMaterial对象,或抛WechatException
     */
    public PermMaterial uploadPermVideo(File video, String title, String desc) {
        return uploadPermVideo(loadAccessToken(), video, title, desc);
    }

    /**
     * 上传永久视频素材(10M大小)
     * @param accessToken accessToken
     * @param fileName 文件名
     * @param data 二进制数据
     * @param title 标题
     * @param desc 描述
     * @return PermMaterial对象,或抛WechatException
     */
    public PermMaterial uploadPermVideo(String accessToken, String fileName, byte[] data, String title, String desc) {
        return uploadPermVideo(accessToken, fileName, new ByteArrayInputStream(data), title, desc);
    }

    /**
     * 上传永久视频素材(10M大小)
     * @param fileName 文件名
     * @param data 二进制数据
     * @param title 标题
     * @param desc 描述
     * @return PermMaterial对象,或抛WechatException
     */
    public PermMaterial uploadPermVideo(String fileName, byte[] data, String title, String desc) {
        return uploadPermVideo(loadAccessToken(), fileName, new ByteArrayInputStream(data), title, desc);
    }

    /**
     * 上传永久视频素材(10M大小)
     * @param accessToken accessToken
     * @param fileName 文件名
     * @param data 二进制数据
     * @param title 标题
     * @param desc 描述
     * @param cb 回调
     */
    public void uploadPermVideo(String accessToken, String fileName, byte[] data, final String title, final String desc, Callback cb) {
        uploadPermVideo(accessToken, fileName, new ByteArrayInputStream(data), title, desc, cb);
    }

    /**
     * 上传永久视频素材(10M大小)
     * @param fileName 文件名
     * @param data 二进制数据
     * @param title 标题
     * @param desc 描述
     * @param cb 回调
     */
    public void uploadPermVideo(String fileName, byte[] data, final String title, final String desc, Callback cb) {
        uploadPermVideo(loadAccessToken(), fileName, new ByteArrayInputStream(data), title, desc, cb);
    }

    /**
     * 上传永久视频素材(10M大小)
     * @param video 文件
     * @param title 标题
     * @param desc 描述
     * @param cb 回调
     */
    public void uploadPermVideo(final File video, final String title, final String desc, Callback cb) {
        uploadPermVideo(loadAccessToken(), video, title, desc, cb);
    }

    /**
     * 上传永久视频素材(10M大小)
     * @param accessToken accessToken
     * @param video 文件
     * @param title 标题
     * @param desc 描述
     * @param cb 回调
     */
    public void uploadPermVideo(final String accessToken, final File video, final String title, final String desc, Callback cb) {
        try {
            uploadPermVideo(accessToken, video.getName(), new FileInputStream(video), title, desc, cb);
        } catch (FileNotFoundException e) {
            throw new WechatException(e);
        }
    }

    /**
     * 上传永久视频素材(10M大小)
     * @param fileName 文件名
     * @param input 输入流
     * @param title 标题
     * @param desc 描述
     * @param cb 回调
     */
    public void uploadPermVideo(final String fileName, final InputStream input, final String title, final String desc, Callback cb) {
        uploadPermVideo(loadAccessToken(), fileName, input, title, desc, cb);
    }

    /**
     * 上传永久视频素材(10M大小)
     * @param accessToken accessToken
     * @param fileName 文件名
     * @param input 输入流
     * @param title 标题
     * @param desc 描述
     * @param cb 回调
     */
    public void uploadPermVideo(final String accessToken, final String fileName, final InputStream input, final String title, final String desc, Callback cb) {
        doAsync(new AsyncFunction(cb) {
            @Override
            public PermMaterial execute() throws Exception {
                return uploadPermVideo(accessToken, fileName, input, title, desc);
            }
        });
    }

    /**
     * 上传永久视频素材(10M大小)
     * @param accessToken accessToken
     * @param fileName 文件名
     * @param input 输入流
     * @param title 标题
     * @param desc 描述
     * @return PermMaterial对象,或抛WechatException
     */
    public PermMaterial uploadPermVideo(String accessToken, String fileName, InputStream input, String title, String desc) {

        checkNotNullAndEmpty(accessToken, "accessToken");
        checkNotNullAndEmpty(fileName, "fileName");
        checkNotNull(input, "input can't be null");
        checkNotNullAndEmpty(title, "title");
        checkNotNullAndEmpty(desc, "desc");

        String url = UPLOAD_PERM + accessToken;

        Map params = Maps.newHashMapWithExpectedSize(2);
        params.put("type", MaterialUploadType.VIDEO.value());

        Map description = Maps.newHashMapWithExpectedSize(2);
        description.put("title", title);
        description.put("introduction", desc);
        params.put("description", Jsons.DEFAULT.toJson(description));

        Map resp = doUpload(url, "media", fileName, input, params);
        return Jsons.DEFAULT.fromJson(Jsons.DEFAULT.toJson(resp), PermMaterial.class);
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy