1. 程式人生 > 其它 >HttpClient實現通過url下載檔案到伺服器

HttpClient實現通過url下載檔案到伺服器

package main.java.com.abp.util;

import org.apache.http.*;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.client.HttpClients;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream; public class HttpDownload { public static final int cache = 10 * 1024; public static final boolean isWindows; public static final String splash; public static final String root; static { if (System.getProperty("os.name") != null && System.getProperty("os.name").toLowerCase().contains("windows")) { isWindows
= true; splash = "\\"; root = "D:"; } else { isWindows = false; splash = "/"; root = "/search"; } } /** * 根據url下載檔案,檔名從response header頭中獲取 * * @param url * @return */ public static String download(String url) {
return download(url, null); } /** * 根據url下載檔案,儲存到filepath中 * * @param url * @param filepath * @return */ public static String download(String url, String filepath) { try { HttpClient client = HttpClients.createDefault(); HttpGet httpget = new HttpGet(url); HttpResponse response = client.execute(httpget); HttpEntity entity = response.getEntity(); InputStream is = entity.getContent(); if (filepath == null){ filepath = getFilePath(response); } File file = new File(filepath); file.getParentFile().mkdirs(); FileOutputStream fileout = new FileOutputStream(file); /** * 根據實際執行效果 設定緩衝區大小 */ byte[] buffer = new byte[cache]; int ch = 0; while ((ch = is.read(buffer)) != -1) { fileout.write(buffer, 0, ch); } is.close(); fileout.flush(); fileout.close(); } catch (Exception e) { e.printStackTrace(); } return null; } /** * 獲取response要下載的檔案的預設路徑 * * @param response * @return */ public static String getFilePath(HttpResponse response) { String filepath = root + splash; String filename = getFileName(response); if (filename != null) { filepath += filename; } else { filepath += getRandomFileName(); } return filepath; } /** * 獲取response header中Content-Disposition中的filename值 * * @param response * @return */ public static String getFileName(HttpResponse response) { Header contentHeader = response.getFirstHeader("Content-Disposition"); String filename = null; if (contentHeader != null) { HeaderElement[] values = contentHeader.getElements(); if (values.length == 1) { NameValuePair param = values[0].getParameterByName("filename"); if (param != null) { try { //filename = new String(param.getValue().toString().getBytes(), "utf-8"); //filename=URLDecoder.decode(param.getValue(),"utf-8"); filename = param.getValue(); } catch (Exception e) { e.printStackTrace(); } } } } return filename; } /** * 獲取隨機檔名 * * @return */ public static String getRandomFileName() { return String.valueOf(System.currentTimeMillis()); } public static void outHeaders(HttpResponse response) { Header[] headers = response.getAllHeaders(); for (int i = 0; i < headers.length; i++) { System.out.println(headers[i]); } } public static void main(String[] args) { String url = "https://codeload.github.com/douban/douban-client/legacy.zip/master"; String filepath = "F:\\xxxx\\workspace\\httpClientProj\\file\\test.zip"; HttpDownload.download(url, filepath); } }