1 package unit;
2
3 import java.io.ByteArrayOutputStream;
4 import java.io.File;
5 import java.io.FileOutputStream;
6 import java.io.IOException;
7 import java.io.InputStream;
8 import java.util.ArrayList;
9 import java.util.HashMap;
10 import java.util.LinkedHashMap;
11 import java.util.List;
12 import java.util.Map;
13 import java.util.Set;
14 import java.util.concurrent.ExecutorService;
15 import java.util.concurrent.Executors;
16
17 import org.apache.http.HttpEntity;
18 import org.apache.http.NameValuePair;
19 import org.apache.http.client.entity.UrlEncodedFormEntity;
20 import org.apache.http.client.methods.CloseableHttpResponse;
21 import org.apache.http.client.methods.HttpGet;
22 import org.apache.http.client.methods.HttpPost;
23 import org.apache.http.entity.ContentType;
24 import org.apache.http.entity.mime.MultipartEntityBuilder;
25 import org.apache.http.entity.mime.content.FileBody;
26 import org.apache.http.entity.mime.content.StringBody;
27 import org.apache.http.impl.client.CloseableHttpClient;
28 import org.apache.http.impl.client.HttpClients;
29 import org.apache.http.message.BasicNameValuePair;
30 import org.apache.http.util.EntityUtils;
31
32 /**
33 * @web http://www.mobctrl.net
34 * @Description: 文件下载 POST GET
35 */
36 public class HttpClientUtils {
37 public static void main(String[] args) {
38 HttpClientUtils.getInstance().download("http://h30318.www3.hp.com/pub/softlib/software13/COL60943/al-146795-2/DJ1110_Full_WebPack_40.11.1124.exe", "D:/down/DJ1110_Full_WebPack_40.11.1124.exe", new HttpClientDownLoadProgress() {
39 @Override
40 public void onProgress(int progress) {
41 System.out.println("download progress = " + progress+"%");
42 }
43 });
44
45 /* // POST 同步方法
46 Map<String, String> params = new HashMap<String, String>();
47 params.put("username", "admin");
48 params.put("password", "admin");
49 HttpClientUtils.getInstance().httpPost(
50 "http://h30318.www3.hp.com/pub/softlib/software13/COL60943/al-146795-2/DJ1110_Full_WebPack_40.11.1124.exe", params);
51
52 // GET 同步方法
53 HttpClientUtils.getInstance().httpGet(
54 "http://wthrcdn.etouch.cn/weather_mini?city=北京");
55
56 // 上传文件 POST 同步方法
57 try {
58 Map<String,String> uploadParams = new LinkedHashMap<String, String>();
59 uploadParams.put("userImageContentType", "image");
60 uploadParams.put("userImageFileName", "testaa.png");
61 HttpClientUtils.getInstance().uploadFileImpl(
62 "http://192.168.31.183:8080/SSHMySql/upload", "android_bug_1.png",
63 "userImage", uploadParams);
64 } catch (Exception e) {
65 e.printStackTrace();
66 }*/
67
68 }
69
70
71 /**
72 * 最大线程池
73 */
74 public static final int THREAD_POOL_SIZE = 5;
75
76 public interface HttpClientDownLoadProgress {
77 public void onProgress(int progress);
78 }
79
80 private static HttpClientUtils httpClientDownload;
81
82 private ExecutorService downloadExcutorService;
83
84 private HttpClientUtils() {
85 downloadExcutorService = Executors.newFixedThreadPool(THREAD_POOL_SIZE);
86 }
87
88 public static HttpClientUtils getInstance() {
89 if (httpClientDownload == null) {
90 httpClientDownload = new HttpClientUtils();
91 }
92 return httpClientDownload;
93 }
94
95 /**
96 * 下载文件
97 *
98 * @param url
99 * @param filePath
100 */
101 public void download(final String url, final String filePath) {
102 downloadExcutorService.execute(new Runnable() {
103 @Override
104 public void run() {
105 httpDownloadFile(url, filePath, null, null);
106 }
107 });
108 }
109
110 /**
111 * 下载文件
112 *
113 * @param url
114 * @param filePath
115 * @param progress
116 * 进度回调
117 */
118 public void download(final String url, final String filePath, final HttpClientDownLoadProgress progress) {
119 downloadExcutorService.execute(new Runnable() {
120 @Override
121 public void run() {
122 httpDownloadFile(url, filePath, progress, null);
123 }
124 });
125 }
126
127 /**
128 * 下载文件
129 * @param url
130 * @param filePath
131 */
132 private void httpDownloadFile(String url, String filePath,
133 HttpClientDownLoadProgress progress, Map<String, String> headMap) {
134 CloseableHttpClient httpclient = HttpClients.createDefault();
135 try {
136 HttpGet httpGet = new HttpGet(url);
137 setGetHead(httpGet, headMap);
138 CloseableHttpResponse response1 = httpclient.execute(httpGet);
139 try {
140 System.out.println(response1.getStatusLine());
141 HttpEntity httpEntity = response1.getEntity();
142 long contentLength = httpEntity.getContentLength();
143 InputStream is = httpEntity.getContent();
144 // 根据InputStream 下载文件
145 ByteArrayOutputStream output = new ByteArrayOutputStream();
146 byte[] buffer = new byte[4096];
147 int r = 0;
148 long totalRead = 0;
149 while ((r = is.read(buffer)) > 0) {
150 output.write(buffer, 0, r);
151 totalRead += r;
152 if (progress != null) {// 回调进度
153 progress.onProgress((int) (totalRead * 100 / contentLength));
154 }
155 }
156 FileOutputStream fos = new FileOutputStream(filePath);
157 output.writeTo(fos);
158 output.flush();
159 output.close();
160 fos.close();
161 EntityUtils.consume(httpEntity);
162 } finally {
163 response1.close();
164 }
165 } catch (Exception e) {
166 e.printStackTrace();
167 } finally {
168 try {
169 httpclient.close();
170 } catch (IOException e) {
171 e.printStackTrace();
172 }
173 }
174 }
175
176 /**
177 * get请求
178 *
179 * @param url
180 * @return
181 */
182 public String httpGet(String url) {
183 return httpGet(url, null);
184 }
185
186 /**
187 * http get请求
188 *
189 * @param url
190 * @return
191 */
192 public String httpGet(String url, Map<String, String> headMap) {
193 String responseContent = null;
194 CloseableHttpClient httpclient = HttpClients.createDefault();
195 try {
196 HttpGet httpGet = new HttpGet(url);
197 CloseableHttpResponse response1 = httpclient.execute(httpGet);
198 setGetHead(httpGet, headMap);
199 try {
200 System.out.println(response1.getStatusLine());
201 HttpEntity entity = response1.getEntity();
202 responseContent = getRespString(entity);
203 System.out.println("debug:" + responseContent);
204 EntityUtils.consume(entity);
205 } finally {
206 response1.close();
207 }
208 } catch (Exception e) {
209 e.printStackTrace();
210 } finally {
211 try {
212 httpclient.close();
213 } catch (IOException e) {
214 e.printStackTrace();
215 }
216 }
217 return responseContent;
218 }
219
220 public String httpPost(String url, Map<String, String> paramsMap) {
221 return httpPost(url, paramsMap, null);
222 }
223
224 /**
225 * http的post请求
226 *
227 * @param url
228 * @param paramsMap
229 * @return
230 */
231 public String httpPost(String url, Map<String, String> paramsMap,
232 Map<String, String> headMap) {
233 String responseContent = null;
234 CloseableHttpClient httpclient = HttpClients.createDefault();
235 try {
236 HttpPost httpPost = new HttpPost(url);
237 setPostHead(httpPost, headMap);
238 setPostParams(httpPost, paramsMap);
239 CloseableHttpResponse response = httpclient.execute(httpPost);
240 try {
241 System.out.println(response.getStatusLine());
242 HttpEntity entity = response.getEntity();
243 responseContent = getRespString(entity);
244 EntityUtils.consume(entity);
245 } finally {
246 response.close();
247 }
248 } catch (Exception e) {
249 e.printStackTrace();
250 } finally {
251 try {
252 httpclient.close();
253 } catch (IOException e) {
254 e.printStackTrace();
255 }
256 }
257 System.out.println("responseContent = " + responseContent);
258 return responseContent;
259 }
260
261 /**
262 * 设置POST的参数
263 *
264 * @param httpPost
265 * @param paramsMap
266 * @throws Exception
267 */
268 private void setPostParams(HttpPost httpPost, Map<String, String> paramsMap)
269 throws Exception {
270 if (paramsMap != null && paramsMap.size() > 0) {
271 List<NameValuePair> nvps = new ArrayList<NameValuePair>();
272 Set<String> keySet = paramsMap.keySet();
273 for (String key : keySet) {
274 nvps.add(new BasicNameValuePair(key, paramsMap.get(key)));
275 }
276 httpPost.setEntity(new UrlEncodedFormEntity(nvps));
277 }
278 }
279
280 /**
281 * 设置http的HEAD
282 *
283 * @param httpPost
284 * @param headMap
285 */
286 private void setPostHead(HttpPost httpPost, Map<String, String> headMap) {
287 if (headMap != null && headMap.size() > 0) {
288 Set<String> keySet = headMap.keySet();
289 for (String key : keySet) {
290 httpPost.addHeader(key, headMap.get(key));
291 }
292 }
293 }
294
295 /**
296 * 设置http的HEAD
297 *
298 * @param httpGet
299 * @param headMap
300 */
301 private void setGetHead(HttpGet httpGet, Map<String, String> headMap) {
302 if (headMap != null && headMap.size() > 0) {
303 Set<String> keySet = headMap.keySet();
304 for (String key : keySet) {
305 httpGet.addHeader(key, headMap.get(key));
306 }
307 }
308 }
309
310 /**
311 * 上传文件
312 *
313 * @param serverUrl
314 * 服务器地址
315 * @param localFilePath
316 * 本地文件路径
317 * @param serverFieldName
318 * @param params
319 * @return
320 * @throws Exception
321 */
322 public String uploadFileImpl(String serverUrl, String localFilePath,
323 String serverFieldName, Map<String, String> params)
324 throws Exception {
325 String respStr = null;
326 CloseableHttpClient httpclient = HttpClients.createDefault();
327 try {
328 HttpPost httppost = new HttpPost(serverUrl);
329 FileBody binFileBody = new FileBody(new File(localFilePath));
330
331 MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder
332 .create();
333 // add the file params
334 multipartEntityBuilder.addPart(serverFieldName, binFileBody);
335 // 设置上传的其他参数
336 setUploadParams(multipartEntityBuilder, params);
337
338 HttpEntity reqEntity = multipartEntityBuilder.build();
339 httppost.setEntity(reqEntity);
340
341 CloseableHttpResponse response = httpclient.execute(httppost);
342 try {
343 System.out.println(response.getStatusLine());
344 HttpEntity resEntity = response.getEntity();
345 respStr = getRespString(resEntity);
346 EntityUtils.consume(resEntity);
347 } finally {
348 response.close();
349 }
350 } finally {
351 httpclient.close();
352 }
353 System.out.println("resp=" + respStr);
354 return respStr;
355 }
356
357 /**
358 * 设置上传文件时所附带的其他参数
359 *
360 * @param multipartEntityBuilder
361 * @param params
362 */
363 private void setUploadParams(MultipartEntityBuilder multipartEntityBuilder,
364 Map<String, String> params) {
365 if (params != null && params.size() > 0) {
366 Set<String> keys = params.keySet();
367 for (String key : keys) {
368 multipartEntityBuilder
369 .addPart(key, new StringBody(params.get(key),
370 ContentType.TEXT_PLAIN));
371 }
372 }
373 }
374
375 /**
376 * 将返回结果转化为String
377 *
378 * @param entity
379 * @return
380 * @throws Exception
381 */
382 private String getRespString(HttpEntity entity) throws Exception {
383 if (entity == null) {
384 return null;
385 }
386 InputStream is = entity.getContent();
387 StringBuffer strBuf = new StringBuffer();
388 byte[] buffer = new byte[4096];
389 int r = 0;
390 while ((r = is.read(buffer)) > 0) {
391 strBuf.append(new String(buffer, 0, r, "UTF-8"));
392 }
393 return strBuf.toString();
394 }
395 }