HttpURLConnection來實作檔案或圖片下載

這個範例與之前的HttpURLConnection來實作get及post動作基本原理是一樣的,一個是使用java.io.BufferedReader來取得文字的html內容,而這個範例則是使用java.io.InputStream取得binary的檔案內容。

程式的流程大概是,先建立HttpConnection,給Connection標題Header、Referer、Cookie等內容,然後建立連線,跟伺服器request要求內容,再取得http的InputStrem,要取得伺服器response的內容,把內容讀取byte[],然後寫入檔案,如此就完成下載檔案的動作了。




程式碼如下:

package com.izero.http;
import java.net.*;
import java.net.Proxy.Type;
import java.io.*;
public class WebModuleDownload {
private org.apache.log4j.Logger logger;
private Proxy proxy;
private String fileName;
private String filePath;
public WebModuleDownload() {
logger = org.apache.log4j.Logger.getLogger(this.getClass());
// buff = new StringBuffer();
proxy = null;
fileName = null;
filePath = null;
}
// 如果要使用proxy,則使用此建構值
public WebModuleDownload(String proxyAddress, int proxyPort) {
this();
proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyAddress,
proxyPort));
}
// 下載後可取得檔案名稱,否則為null
public String getFileName() {
return fileName;
}
// 下載後可取得檔案路徑,否則為null
public String getFilePath() {
return filePath;
}
// 下載網址,
// 使用cookie(可為null),
// referer(可為null),
// 存放檔案路徑(一定要有),
// 存放檔案名稱(如為null則使用網址的檔名)
public boolean doGet(String sURL, String cookie, String referer,
String filePath, String fileName) {
boolean doSuccess = true;
BufferedReader in = null;
try {
URL url = new URL(sURL);
HttpURLConnection URLConn = null;
// 如有使用proxy,則openConnection時傳入proxy產數
if (proxy != null)
URLConn = (HttpURLConnection) url.openConnection(proxy);
else
URLConn = (HttpURLConnection) url.openConnection();
// 要求的標頭header
URLConn.setRequestProperty(
"User-agent",
"Mozilla/5.0 (Windows; U; Windows NT 6.0; zh-TW; rv:1.9.1.2) "
+ "Gecko/20090729 Firefox/3.5.2 GTB5 (.NET CLR 3.5.30729)");
URLConn.setRequestProperty("Accept",
"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
URLConn.setRequestProperty("Accept-Language",
"zh-tw,en-us;q=0.7,en;q=0.3");
URLConn.setRequestProperty("Accept-Charse",
"Big5,utf-8;q=0.7,*;q=0.7");
// 是否使用cookie
if (cookie != null)
URLConn.setRequestProperty("Cookie", cookie);
// 是否使用referer
if (referer != null)
URLConn.setRequestProperty("Referer", referer);
// URLConn.setDoInput(true);
// URLConn.setDoOutput(true);
// 建立連線
URLConn.connect();
// URLConn.getOutputStream().flush();
// 取得下載inputstream連線
java.io.BufferedInputStream rd = new java.io.BufferedInputStream(
URLConn.getInputStream());
String saveFileName = fileName;
// 檔名參數為null,則取下載網址的檔名為檔名
if (fileName == null) {
int start = sURL.lastIndexOf("/") + 1;
int end = sURL.lastIndexOf("?", start);
if (end == -1)
end = sURL.length();
// System.out.println(start+","+end);
saveFileName = sURL.substring(start, end);
}
java.io.File f = new java.io.File(filePath);
f = new java.io.File(f.getAbsolutePath());
if (!f.exists())
f.mkdirs();
f = new java.io.File(f.getAbsolutePath() + java.io.File.separator
+ saveFileName);
this.fileName = saveFileName;
// 取得路徑
this.filePath = f.getAbsolutePath();
java.io.BufferedOutputStream fos = new java.io.BufferedOutputStream(
new java.io.FileOutputStream(f));
byte[] tmp = new byte[1024];
int len;
// 讀取httpConection的input,寫出檔案的output
while ((len = rd.read(tmp)) != -1) {
// System.out.print(tmp);
fos.write(tmp, 0, len);
}
fos.flush();
fos.close();
rd.close();
} catch (IOException e) {
doSuccess = false;
logger.info(e);
e.printStackTrace();
} finally {
if (in != null) {
try {
in.close();
} catch (java.io.IOException ex) {
logger.info(ex);
}
in = null;
}
}
return doSuccess;
}
public static void main(String args[]) throws IOException {
WebModuleDownload web = new WebModuleDownload();
web.doGet("http://l.yimg.com/f/i/tw/news/p_logo/yptw.png", null, null,
"d:/", null);
/*
* java.awt.image.BufferedImage image = javax.imageio.ImageIO .read(new
* ByteArrayInputStream(web.getContent()));
* javax.imageio.ImageIO.write(image, "JPEG", new
* File("d:/HEX1PA35-A.JPG"));
*/
}
}

發表迴響