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 + "\r\n").getBytes());  
175             outputStream.write(String.format("Content-Disposition: form-data; name=\"media\"; filename=\"file1%s\"\r\n", fileExt).getBytes());  
176             outputStream.write(String.format("Content-Type: %s\r\n\r\n", 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(("\r\n--" + boundary + "--\r\n").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 }

多媒體文件上傳與下載完成

轉載于:https://www.cnblogs.com/wangtianze/p/6761598.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/254760.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/254760.shtml
英文地址,請注明出處:http://en.pswp.cn/news/254760.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

add_metrology_object_generic將測量對象添加到計量模型中

目錄add_metrology_object_generic&#xff08;算子&#xff09;描述可能的形狀測量區域的定義通用參數參數add_metrology_object_generic&#xff08;算子&#xff09; add_metrology_object_generic - 將計量對象添加到計量模型中。 add_metrology_object_generic&#xff…

關于發那科機器人的FSSB

&#xfeff;&#xfeff;FSSB是指fanuc Serial Servo Bus&#xff0c;即發那科串行伺服總線&#xff08;光纜&#xff09;&#xff0c;連接CNC與伺服放大器。HSSB是指High-Speed Serial Bus&#xff0c;即高速串行總線&#xff08;光纜&#xff09;&#xff0c;連接CNC與外部P…

H264規定了三種主要檔次

H264規定了三種主要檔次&#xff0c;每個檔次支持一組特定的編碼功能&#xff0c;并支持一類特定的應用。 1、基本檔次&#xff08;Baseline Profile&#xff09;&#xff1a;利用I片和P片支持幀內和幀間編碼&#xff0c;支持利用基于上下文的自適應的變長編碼進行的熵編碼&…

get_metrology_object_result 獲取計量模型的測量結果

目錄get_metrology_object_result&#xff08;算子&#xff09;描述result_type&#xff1a;獲取所有參數&#xff1a;獲取特定參數&#xff1a;獲得分數&#xff1a;used_edges&#xff1a;行&#xff1a;列&#xff1a;振幅&#xff1a;angle_direction&#xff1a;參數get_m…

iOS開發UI篇—字典轉模型

一、能完成功能的“問題代碼” 1.從plist中加載的數據 2.實現的代碼 1 //2 // LFViewController.m3 // 03-應用管理4 //5 // Created by apple on 14-5-22.6 // Copyright (c) 2014年 heima. All rights reserved.7 //8 9 #import "LFViewController.h" 10 11 i…

Codechef:Path Triples On Tree

Path Triples On Tree 題意是求樹上都不相交或者都相交的路徑三元組數量。 發現blog里沒什么樹形dp題&#xff0c;也沒有cc題&#xff0c;所以來丟一道cc上的樹形dp題。 比較暴力&#xff0c;比較惡心 #include<cstdio> #include<algorithm> #define MN 300001 #de…

grbl

第一次發帖...之前上論壇都是查資料的&#xff0c;發現gcode這一塊資料比較少先說一下Gcode:Gcode在工業控制上用的很多&#xff0c;是一種通用的控制指令&#xff0c;數控機床上經常用&#xff0c;在我diy雕刻機&#xff08;打印機之類的&#xff09;的時候要用到&#xff0c;…

mybitis實現增,刪,改,查,模糊查詢的兩種方式:(2)

方式二&#xff1a;mapper代理接口方式 這種方式只需要xml接口&#xff08;不用寫實體類&#xff09;但是需要符合三個規范 使用mapper代理接口方式在同一目錄下&#xff08;可以創建一個源文件夾&#xff0c;達到類文件和xml文件分類的作用&#xff09;xml中namespace&#xf…

C語言中的靜態函數的作用

轉載 在C語言中為什么要用靜態函數(static function)&#xff1f;如果不用這個static關鍵字&#xff0c;好象沒有關系。那么&#xff0c;用了static以后&#xff0c;有什么作用呢&#xff1f;我們知道&#xff0c;用了static的變量&#xff0c;叫做靜態變量&#xff0c;其意義是…

[轉] sql server 跨數據庫調用存儲過程

A庫存儲過程&#xff1a; create PROCEDURE [dbo].[spAAAForTest] ( UserName nvarchar(20) null ,LoginPwd nvarchar(60) null ) AS BEGINselect NA AS a, NB AS B, NC AS C;END 同一臺服務器實例&#xff0c;A&#xff0c;B兩個數據庫&#xff0c;…

get_metrology_object_result_contour查詢計量對象的結果輪廓

目錄get_metrology_object_result_contour&#xff08;算子&#xff09;描述參數get_metrology_object_result_contour&#xff08;算子&#xff09; get_metrology_object_result_contour - 查詢計量對象的結果輪廓。 get_metrology_object_result_contour&#xff08;&…

ABB 機器人 壓包指令PackRawBytes 解包指令UnpackRawBytes

ABB 壓包指令PackRawBytes 解包指令UnpackRawBytes PackRawBytes- 將數據導入 rawbytes 數據。 使用方法 PackRawBytes 用于將 num, dnum, byte,或者 string類型的數據&#xff0c;打包到 rawbytes 類型的變量中. 基本舉例 &#xff1a; VAR rawbytes raw_…

C語言中使用靜態函數的好處

靜態函數會被自動分配在一個一直使用的存儲區&#xff0c;直到退出應用程序實例&#xff0c;避免了調用函數時壓棧出棧&#xff0c;速度快很多。 關鍵字“static”&#xff0c;譯成中文就是“靜態的”&#xff0c;所以內部函數又稱靜態函數。但此處“static”的含義不是指存儲方…

react+redux+generation-modation腳手架搭建一個todolist

TodoList1. 編寫actions.js2. 分析state 試著拆分成多個reducer3. 了解store4. 了解redux數據流生命周期5. 分析容器組件和展示組件 搞清楚&#xff0c;數據到底是如何流動的&#xff1f;6. 編寫展示組件的代碼7. 編寫容器組件8. 傳入store9. 總結10. 參考TodoList 腳手架Githu…

c++11 原子類型與原子操作

1、原子類型和原子操作&#xff08;1&#xff09;類型&#xff08;2&#xff09;操作&#xff08;3&#xff09;詳述● 原子類型只能從其模板參數類型中進行構造&#xff0c;標準不允許原子類型進行拷貝構造、移動構造&#xff0c;以及使用operator等● atomic_flag 是一個原子…

get_metrology_object_measures獲取測量區域和計量模型的計量對象的邊緣位置結果

目錄get_metrology_object_measures&#xff08;算子&#xff09;描述參數get_metrology_object_measures&#xff08;算子&#xff09; get_metrology_object_measures - 獲取測量區域和計量模型的計量對象的邊緣位置結果。 get_metrology_object_measures&#xff08;&…

依弗科(上海)機電設備有限公司

機器人噴涂倒計時&#xff0c;上帝幫我實現愿望吧 阿門 &#xfeff;&#xfeff;&#xfeff;&#xfeff;

外部變量和外部函數

C程序由一組對象組成&#xff0c;這些對象包括程序中所使用的變量和實現特定功能的函數。變量可以分為函數內部定義、使用的變量和函數外部定義的變量&#xff0c;通常情況下&#xff0c;把函數內部定義、使用的變量稱為內部變量或局部變量&#xff0c;而將在函數外部定義的、供…

gulp中使用babel-polyfill編譯es6拓展語法

今天想在新項目中使用es6的generators&#xff0c;發現雖然gulp已經有了babel編譯&#xff0c;但仍會報錯&#xff0c;網上查找后發現解決辦法是加載polyfill&#xff0c;但是找到的辦法都不試用我的項目。 解決辦法&#xff1a;在index.html中加載node_modules的babel-polyfil…