HttpClient实现HTTP文件通用下载类

可以实现文件下载的通用类:

我们没有测试过,只是摘录网站的内容。[code]import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;

import org.apache.http.Header;
import org.apache.http.HeaderElement;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

/**

  • 说明
  • 利用httpclient下载文件
  • maven依赖
  •   	<groupId>org.apache.httpcomponents</groupId>
    
  •   	<artifactId>httpclient</artifactId>
    
  •   	<version>4.0.1</version>
    
  •   </dependency>
    
  • 可下载http文件、图片、压缩文件
  • bug:获取response header中Content-Disposition中filename中文乱码问题
  • @author tanjundong

*/
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 = new DefaultHttpClient();
		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 = “http://bbs.btwuji.com/job.php?action=download&pid=tpc&tid=320678&aid=216617”;
String url=“http://www.dy1000.com/img/20120701/1999311085_150_200.JPG”;
// String filepath = “D:\test\a.torrent”;
String filepath = “D:\test\a.jpg”;
HttpDownload.download(url, filepath);
}
}
[/code]