其實就是通過瀏覽器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); } }
測試(可忽略,主要自己業務要用到)
@Test public void test1(){ String docRootPath = "F:\\xxxx\\workspace\\httpClientProj\\file"; String readFileName = "test.zip"; String writeFileName = "write.zip"; File readFile = new File(docRootPath+"\\"+readFileName); File writeFile = new File(docRootPath+"\\"+writeFileName); try { byte[] content1 = "CONTENT=".getBytes(); byte[] content2 = FileUtils.readFileToByteArray(readFile); //拷貝文件文件 FileUtils.writeByteArrayToFile(writeFile,content1); FileUtils.writeByteArrayToFile(writeFile,content2,true); System.out.println("------------------------------ok"); } catch (IOException e) { e.printStackTrace(); } } @Test public void test2(){ String docRootPath = "F:\\xxxx\\workspace\\httpClientProj\\file"; String readFileName = "write.zip"; String writeFileName = "write1.zip"; File readFile = new File(docRootPath+"\\"+readFileName); File writeFile = new File(docRootPath+"\\"+writeFileName); try { byte[] content1 = "CONTENT=".getBytes(); int startIndex = content1.length; byte[] content2 = FileUtils.readFileToByteArray(readFile); byte[] content3 = Arrays.copyOfRange(content2,startIndex,content2.length); //拷貝文件文件 FileUtils.writeByteArrayToFile(writeFile,content3); System.out.println("------------------------------ok"); } catch (IOException e) { e.printStackTrace(); } }