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 }