• Java微信二次开发(九)


    多媒体文件上传与下载

    第一步:找到包com.wtz.vo,新建类WeixinMedia.java

     1 package com.wtz.vo;
     2 
     3 /**
     4  *     @author wangtianze QQ:864620012
     5  *    @date 2017年4月25日 上午11:10:31
     6  *  <p>version:1.0</p>
     7  *     <p>description:媒体文件信息</p>
     8  */
     9 public class WeixinMedia {
    10     // 媒体文件类型
    11     private String type;
    12     // 媒体文件标识或缩略图的媒体文件标识
    13     private String mediaId;
    14     // 媒体文件上传的时间
    15     private int createdAt;
    16 
    17     public String getType() {
    18         return type;
    19     }
    20 
    21     public void setType(String type) {
    22         this.type = type;
    23     }
    24 
    25     public String getMediaId() {
    26         return mediaId;
    27     }
    28 
    29     public void setMediaId(String mediaId) {
    30         this.mediaId = mediaId;
    31     }
    32 
    33     public int getCreatedAt() {
    34         return createdAt;
    35     }
    36 
    37     public void setCreatedAt(int createdAt) {
    38         this.createdAt = createdAt;
    39     }
    40 }

    第二步,找到包com.wtz.util,修改类AdvancedUtil.java

      1 package com.wtz.util;
      2 
      3 import java.io.BufferedInputStream;
      4 import java.io.BufferedReader;
      5 import java.io.File;
      6 import java.io.FileOutputStream;
      7 import java.io.InputStream;
      8 import java.io.InputStreamReader;
      9 import java.io.OutputStream;
     10 import java.net.HttpURLConnection;
     11 import java.net.URL;
     12 import java.text.SimpleDateFormat;
     13 import java.util.Date;
     14 import java.util.List;
     15 
     16 import net.sf.json.JSONArray;
     17 import net.sf.json.JSONObject;
     18 
     19 import org.slf4j.Logger;
     20 import org.slf4j.LoggerFactory;
     21 
     22 import com.wtz.vo.UserInfo;
     23 import com.wtz.vo.UserList;
     24 import com.wtz.vo.WeixinMedia;
     25 
     26 /**
     27  *     @author wangtianze QQ:864620012
     28  *    @date 2017年4月24日 下午7:36:03
     29  *  <p>version:1.0</p>
     30  *     <p>description:高级接口工具类</p>
     31  */
     32 public class AdvancedUtil {
     33     private static Logger log = LoggerFactory.getLogger(AdvancedUtil.class);
     34     
     35     /**
     36      * 获取用户信息
     37      * 
     38      * @param accessToken 接口访问凭证
     39      * @param openId 用户凭证
     40      * @return WeixinUserInfo
     41      */
     42     public static UserInfo getUserInfo(String accessToken,String openId){
     43         UserInfo weixinUserInfo = null;
     44         //拼接请求地址
     45         String requestUrl = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID";
     46         requestUrl = requestUrl.replace("ACCESS_TOKEN",accessToken).replace("OPENID",openId);
     47         //获取用户信息
     48         JSONObject jsonObject = WeixinUtil.httpsRequest(requestUrl, "GET", null);
     49         
     50         if(null != jsonObject){
     51             try{
     52                 weixinUserInfo = new UserInfo();
     53                 
     54                 //用户的标识
     55                 weixinUserInfo.setOpenId(jsonObject.getString("openid"));
     56                 
     57                 //关注状态(1是关注,0是未关注),未关注时获取不到其余信息
     58                 weixinUserInfo.setSubscribe(jsonObject.getInt("subscribe"));
     59                 
     60                 //用户关注时间
     61                 weixinUserInfo.setSubscribeTime(jsonObject.getString("subscribe_time"));
     62                 
     63                 //昵称
     64                 weixinUserInfo.setNickname(jsonObject.getString("nickname"));
     65                 
     66                 //用户的性别(1是男性,2是女性,0是未知)
     67                 weixinUserInfo.setSex(jsonObject.getInt("sex"));
     68                 
     69                 //用户所在的国家
     70                 weixinUserInfo.setCountry(jsonObject.getString("country"));
     71                 
     72                 //用户所在的省份
     73                 weixinUserInfo.setProvince(jsonObject.getString("province"));
     74                 
     75                 //用户所在的城市
     76                 weixinUserInfo.setCity(jsonObject.getString("city"));
     77                 
     78                 //用户的语言,简体中文为zh_CN
     79                 weixinUserInfo.setLanguage(jsonObject.getString("language"));
     80                 
     81                 //用户头像
     82                 weixinUserInfo.setHeadImgUrl(jsonObject.getString("headimgurl"));
     83                 
     84                 //uninonid
     85                 weixinUserInfo.setUnionid(jsonObject.getString("unionid"));
     86             }catch(Exception e){
     87                 if(0 == weixinUserInfo.getSubscribe()){
     88                     log.error("用户{}已取消关注",weixinUserInfo.getOpenId());
     89                 }else{
     90                     int errorCode = jsonObject.getInt("errcode");
     91                     String errorMsg = jsonObject.getString("errmsg");
     92                     log.error("获取用户信息失败 errorcode:{} errormsg:{}",errorCode,errorMsg);
     93                 }
     94             }
     95         }
     96         return weixinUserInfo;
     97     } 
     98     
     99     /**
    100      * 获取关注者列表
    101      * 
    102      * @param accessToken 调用接口凭证
    103      * @param nextOpenId 第一个拉取nextOpenId,不填默认从头开始拉取
    104      * @return WeixinUserList
    105      */
    106     @SuppressWarnings({ "deprecation", "unchecked" })
    107     public static UserList getUserList(String accessToken,String nextOpenId){
    108         UserList weixinUserList = null;
    109         if(null == nextOpenId){
    110             nextOpenId = "";
    111         }
    112         //拼接请求地址
    113         String requestUrl = "https://api.weixin.qq.com/cgi-bin/user/get?access_token=ACCESS_TOKEN&next_openid=NEXT_OPENID";
    114         
    115         requestUrl.replace("ACCESS_TOKEN", accessToken).replace("NEXT_OPENID",nextOpenId);
    116         
    117         //获取关注者列表
    118         JSONObject jsonObject = WeixinUtil.httpsRequest(requestUrl, "GET", null);
    119         
    120         //如果请求成功
    121         if(null != jsonObject){
    122             weixinUserList = new UserList();
    123             weixinUserList.setTotal(jsonObject.getInt("total"));
    124             weixinUserList.setCount(jsonObject.getInt("count"));
    125             weixinUserList.setNextOpenId(jsonObject.getString("next_openid"));
    126             JSONObject dataObject = (JSONObject)jsonObject.get("data");
    127             weixinUserList.setOpenIdList(JSONArray.toList(dataObject.getJSONArray("openid"),List.class));    
    128         }
    129 
    130         return weixinUserList;
    131     }
    132     
    133     /** 
    134      * 上传媒体文件 
    135      * @param accessToken 接口访问凭证 
    136      * @param type 媒体文件类型,分别有图片(image)、语音(voice)、视频(video),普通文件(file) 
    137      * @param media form-data中媒体文件标识,有filename、filelength、content-type等信息 
    138      * @param mediaFileUrl 媒体文件的url 
    139      * 上传的媒体文件限制 
    140         * 图片(image):1MB,支持JPG格式 
    141         * 语音(voice):2MB,播放长度不超过60s,支持AMR格式 
    142         * 视频(video):10MB,支持MP4格式 
    143         * 普通文件(file):10MB 
    144      * */  
    145     public static WeixinMedia uploadMedia(String accessToken, String type, String mediaFileUrl) {  
    146         WeixinMedia weixinMedia = null;  
    147         // 拼装请求地址  
    148         String uploadMediaUrl = "https://qyapi.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE";  
    149         uploadMediaUrl = uploadMediaUrl.replace("ACCESS_TOKEN", accessToken).replace("TYPE", type);  
    150       
    151         // 定义数据分隔符  
    152         String boundary = "------------7da2e536604c8";  
    153         try {  
    154             URL uploadUrl = new URL(uploadMediaUrl);  
    155             HttpURLConnection uploadConn = (HttpURLConnection) uploadUrl.openConnection();  
    156             uploadConn.setDoOutput(true);  
    157             uploadConn.setDoInput(true);  
    158             uploadConn.setRequestMethod("POST");  
    159             // 设置请求头Content-Type  
    160             uploadConn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);  
    161             // 获取媒体文件上传的输出流(往微信服务器写数据)  
    162             OutputStream outputStream = uploadConn.getOutputStream();  
    163       
    164             URL mediaUrl = new URL(mediaFileUrl);  
    165             HttpURLConnection meidaConn = (HttpURLConnection) mediaUrl.openConnection();  
    166             meidaConn.setDoOutput(true);  
    167             meidaConn.setRequestMethod("GET");  
    168       
    169             // 从请求头中获取内容类型  
    170             String contentType = meidaConn.getHeaderField("Content-Type");  
    171             // 根据内容类型判断文件扩展名  
    172             String fileExt = WeixinUtil.getFileExt(contentType);  
    173             // 请求体开始  
    174             outputStream.write(("--" + boundary + "
    ").getBytes());  
    175             outputStream.write(String.format("Content-Disposition: form-data; name="media"; filename="file1%s"
    ", fileExt).getBytes());  
    176             outputStream.write(String.format("Content-Type: %s
    
    ", contentType).getBytes());  
    177       
    178             // 获取媒体文件的输入流(读取文件)  
    179             BufferedInputStream bis = new BufferedInputStream(meidaConn.getInputStream());  
    180             byte[] buf = new byte[8096];  
    181             int size = 0;  
    182             while ((size = bis.read(buf)) != -1) {  
    183                 // 将媒体文件写到输出流(往微信服务器写数据)  
    184                 outputStream.write(buf, 0, size);  
    185             }  
    186             // 请求体结束  
    187             outputStream.write(("
    --" + boundary + "--
    ").getBytes());  
    188             outputStream.close();  
    189             bis.close();  
    190             meidaConn.disconnect();  
    191       
    192             // 获取媒体文件上传的输入流(从微信服务器读数据)  
    193             InputStream inputStream = uploadConn.getInputStream();  
    194             InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");  
    195             BufferedReader bufferedReader = new BufferedReader(inputStreamReader);  
    196             StringBuffer buffer = new StringBuffer();  
    197             String str = null;  
    198             while ((str = bufferedReader.readLine()) != null) {  
    199                 buffer.append(str);  
    200             }  
    201             bufferedReader.close();  
    202             inputStreamReader.close();  
    203             // 释放资源  
    204             inputStream.close();  
    205             inputStream = null;  
    206             uploadConn.disconnect();  
    207       
    208             // 使用JSON-lib解析返回结果  
    209             JSONObject jsonObject = JSONObject.fromObject(buffer.toString());  
    210             // 测试打印结果  
    211             System.out.println("打印测试结果"+jsonObject);  
    212             weixinMedia = new WeixinMedia();  
    213             weixinMedia.setType(jsonObject.getString("type"));  
    214             // type等于 缩略图(thumb) 时的返回结果和其它类型不一样  
    215             if ("thumb".equals(type))  
    216                 weixinMedia.setMediaId(jsonObject.getString("thumb_media_id"));  
    217             else  
    218                 weixinMedia.setMediaId(jsonObject.getString("media_id"));  
    219                 weixinMedia.setCreatedAt(jsonObject.getInt("created_at"));  
    220         } catch (Exception e) {  
    221             weixinMedia = null;  
    222             String error = String.format("上传媒体文件失败:%s", e);  
    223             System.out.println(error);  
    224         }  
    225         return weixinMedia;  
    226     }  
    227     
    228     /** 
    229      * 获取媒体文件 
    230      * @param accessToken 接口访问凭证 
    231      * @param media_id 媒体文件id 
    232      * @param savePath 文件在服务器上的存储路径 
    233      * */  
    234     public static String downloadMedia(String accessToken, String mediaId, String savePath) {  
    235         String filePath = null;  
    236         // 拼接请求地址  
    237         String requestUrl = "https://qyapi.weixin.qq.com/cgi-bin/media/get?access_token=ACCESS_TOKEN&media_id=MEDIA_ID";  
    238         requestUrl = requestUrl.replace("ACCESS_TOKEN", accessToken).replace("MEDIA_ID", mediaId);  
    239         System.out.println(requestUrl);  
    240         try {  
    241             URL url = new URL(requestUrl);  
    242             HttpURLConnection conn = (HttpURLConnection) url.openConnection();  
    243             conn.setDoInput(true);  
    244             conn.setRequestMethod("GET");  
    245   
    246             if (!savePath.endsWith("/")) {  
    247                 savePath += "/";  
    248             }  
    249             // 根据内容类型获取扩展名  
    250             String fileExt = WeixinUtil.getFileExt(conn.getHeaderField("Content-Type"));  
    251             // 将mediaId作为文件名  
    252             filePath = savePath + mediaId + fileExt;  
    253   
    254             BufferedInputStream bis = new BufferedInputStream(conn.getInputStream());  
    255             FileOutputStream fos = new FileOutputStream(new File(filePath));  
    256             byte[] buf = new byte[8096];  
    257             int size = 0;  
    258             while ((size = bis.read(buf)) != -1)  
    259                 fos.write(buf, 0, size);  
    260             fos.close();  
    261             bis.close();  
    262   
    263             conn.disconnect();  
    264             String info = String.format("下载媒体文件成功,filePath=" + filePath);  
    265             System.out.println(info);  
    266         } catch (Exception e) {  
    267             filePath = null;  
    268             String error = String.format("下载媒体文件失败:%s", e);  
    269             System.out.println(error);  
    270         }  
    271         return filePath;  
    272     }  
    273     
    274     public static void main(String[] args){
    275         //获取接口访问凭证
    276         String accessToken = WeixinUtil.getToken(Parameter.appId,Parameter.appSecret).getAccessToken();
    277         System.out.println("accessToken:" + accessToken);
    278         
    279         //获取关注者列表
    280         UserList weixinUserList = getUserList(accessToken,"");
    281         System.out.println("总关注用户数:" + weixinUserList.getTotal());
    282         System.out.println("本次获取用户数:" + weixinUserList.getCount());
    283         System.out.println("OpenId列表:" + weixinUserList.getOpenIdList().toString());
    284         System.out.println("next_openid" + weixinUserList.getNextOpenId());
    285         
    286         UserInfo user = null;
    287         List<String> list = weixinUserList.getOpenIdList();
    288         for(int i = 0; i < list.size(); i++){
    289             //获取用户信息
    290             user = getUserInfo(accessToken,(String)list.get(i));
    291             System.out.println("OpenId:" + user.getOpenId());
    292             System.out.println("关注状态:" + user.getSubscribe());
    293             System.out.println("关注时间:" + (new SimpleDateFormat("yyyy-MM-dd HH:mm-ss").format(new Date(new Long(user.getSubscribeTime())))));
    294             System.out.println("昵称:" + user.getNickname());
    295             System.out.println("性别:" + user.getSex());
    296             System.out.println("国家:" + user.getCountry());
    297             System.out.println("省份:" + user.getProvince());
    298             System.out.println("城市:" + user.getCity());
    299             System.out.println("语言:" + user.getLanguage());
    300             System.out.println("头像:" + user.getHeadImgUrl());
    301             System.out.println("unionid:" + user.getUnionid());
    302             System.out.println("=====================================");
    303         }
    304         
    305         /** 
    306          * 上传多媒体文件 
    307          */  
    308         //地址  
    309         WeixinMedia weixinMedia = uploadMedia(accessToken, "image", "http://localhost:8080/weixinClient/images/a.jpg");  
    310         //media_id  
    311         System.out.println("media_id:"+weixinMedia.getMediaId());  
    312         //类型  
    313         System.out.println("类型:"+weixinMedia.getType());  
    314         //时间戳  
    315         System.out.println("时间戳:"+weixinMedia.getCreatedAt());  
    316         //打印结果  
    317         if(null != weixinMedia){  
    318             System.out.println("上传成功!");  
    319         } 
    320   
    321         /** 
    322          * 下载多媒体文件 
    323          */  
    324         String savePath = downloadMedia(accessToken, weixinMedia.getMediaId(), "C:/download");  
    325         System.out.println("下载成功之后保存在本地的地址为:"+savePath);  
    326     }
    327 }

    多媒体文件上传与下载完成

  • 相关阅读:
    学习笔记
    .net $&替换正则查找到的内容
    sql 常用日期函数
    2010学习计划
    优化存储过程
    sql server 标量值函数
    job88数据库操作
    .net 调用有返回值的存储过程
    GridView 18种操作
    SQLite的局限性
  • 原文地址:https://www.cnblogs.com/wangtianze/p/6761598.html
Copyright © 2020-2023  润新知