下載圖片

import java.io.BufferedInputStream;

import java.io.ByteArrayOutputStream;

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import java.net.HttpURLConnection;

import java.net.MalformedURLException;

import java.net.URL;

import java.security.KeyManagementException;

import java.security.NoSuchAlgorithmException;

import java.security.cert.CertificateException;

import java.security.cert.X509Certificate;

import javax.net.ssl.HttpsURLConnection;

import javax.net.ssl.SSLContext;

import javax.net.ssl.TrustManager;

import javax.net.ssl.X509TrustManager;

public class ImageDownloader {

public static void main(String[] args) {

String fileName_http = downloadImageFromUrl("http://www.image.com/files/8813/5551/7470/cruise-ship.png","D:" + File.separator, "HttpImgTest");

System.out.println("Http的圖片下載: " + fileName_http);

String fileName_https = downloadImageFromUrl("https://upload.wikimedia.org/wikipedia/commons/thumb/e/ea/Plithocyon_armagnacensis.JPG/220px-Plithocyon_armagnacensis.JPG","D:" + File.separator, "HttpsImgTest");

System.out.println("Https的圖片下載: " + fileName_https);

}

public static String downloadImageFromUrl(String url, String fileDirectoryPath, String fileNameWithoutFormat) {

String filePath = null;

BufferedInputStream in = null;

ByteArrayOutputStream out = null;

HttpURLConnection httpUrlConnection = null;

FileOutputStream file = null;

try {

if (url.startsWith("https://")) {

//HTTPS時

httpUrlConnection = getHttpURLConnectionFromHttps(url);

}

//如果不是HTTPS或是沒成功得到httpUrlConnection,用HTTP的方法

if(httpUrlConnection == null) {

httpUrlConnection = (HttpURLConnection) (new URL(url)).openConnection();

}

// 設置User-Agent,偽裝成一般瀏覽器,不然有些伺服器會擋掉機器程式請求

httpUrlConnection.setRequestProperty("User-Agent", "Mozilla/5.0 (Linux; Android 4.2.1; Nexus 7 Build/JOP40D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19");

httpUrlConnection.connect();

String imageType;

if (httpUrlConnection.getResponseCode() == 200) {

//成功取得response,

//取得contentType

String contentType = httpUrlConnection.getHeaderField("Content-Type");

// 只處理image的回應

if ("image".equals(contentType.substring(0, contentType.indexOf("/")))) {

//得到對方Server提供的圖片副檔名,如jpg, png等

imageType = contentType.substring(contentType.indexOf("/") + 1);

if (imageType != null && !"".equals(imageType)) {

//由HttpUrlConnection取得輸入串流

in = new BufferedInputStream(httpUrlConnection.getInputStream());

out = new ByteArrayOutputStream();

//建立串流Buffer

byte[] buffer = new byte[1024];

file = new FileOutputStream(new File(fileDirectoryPath + File.separator + fileNameWithoutFormat + "." + imageType));

int readByte;

while ((readByte = in.read(buffer)) != -1) {

//輸出檔案

out.write(buffer, 0, readByte);

}

byte[] response = out.toByteArray();

file.write(response);

//下載成功後,返回檔案路徑

filePath = fileDirectoryPath + File.separator + fileNameWithoutFormat + "." + imageType;

}

}

}

} catch (MalformedURLException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

} finally {

//關閉各種串流

try {

if (out != null) {

out.close();

}

if (in != null) {

in.close();

}

if (httpUrlConnection != null) {

httpUrlConnection.disconnect();

}

if (file != null) {

file.close();

}

}catch (IOException e) {

e.printStackTrace();

}

}

return filePath;

}

public static HttpURLConnection getHttpURLConnectionFromHttps(String url) {

HttpURLConnection httpUrlConnection = null;

//建立一個信認所有憑證的X509TrustManager,放到TrustManager裡面

TrustManager[] trustAllCerts;

try {

// Activate the new trust manager

trustAllCerts = new TrustManager[] { new X509TrustManager() {

public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { // TODO Auto-generated method stub

//不作任何事

}

public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { // TODO Auto-generated method stub

//不作任何事

}

public X509Certificate[] getAcceptedIssuers() {

//不作任何事

return null;

}

}

};

//設置SSL設定

SSLContext sslContext = SSLContext.getInstance("SSL");

sslContext.init(null, trustAllCerts, new java.security.SecureRandom());

HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());

//跟HTTP一樣,用Url建立連線

httpUrlConnection = (HttpURLConnection) (new URL(url)).openConnection();

} catch (KeyManagementException e) {

e.printStackTrace();

} catch (NoSuchAlgorithmException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

return httpUrlConnection;

}

}