`
macken
  • 浏览: 345627 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

HttpClient实现HTTP文件通用下载类

    博客分类:
  • Java
 
阅读更多
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依赖
 * <dependency>
*			<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);
	}
}

参考资料:
http://eyecm.com/httpclient4-1-tutorial-official-examples-to-explain-httpclient4-1-usage/
http://eyecm.com/httpclient-download/
分享到:
评论
3 楼 gaojunda413 2012-08-03  
macken 写道
gaojunda413 写道
Content-Disposition  我获取的是乱码  各种转也没解出来,求告知

获取所有网站的header都是乱码吗?方便的话可以贴一下代码

已经好了
setParameter(CoreProtocolPNames.HTTP_ELEMENT_CHARSET, "gbk");

2 楼 macken 2012-07-06  
gaojunda413 写道
Content-Disposition  我获取的是乱码  各种转也没解出来,求告知

获取所有网站的header都是乱码吗?方便的话可以贴一下代码
1 楼 gaojunda413 2012-07-06  
Content-Disposition  我获取的是乱码  各种转也没解出来,求告知

相关推荐

    通过 HttpClient 下载 文件

    本主题将深入探讨如何利用HttpClient实现文件的下载功能,同时也会涉及相关的源码解析和辅助工具的使用。 首先,HttpClient是一个Java库,它允许开发者以一种与HTTP协议兼容的方式发送请求并接收响应。它提供了丰富...

    对于C#(HttpClient)方式网络请求的封装

    标题中的“对于C#(HttpClient)方式网络请求的封装”是指使用C#编程语言,特别是通过HttpClient类来处理HTTP网络请求,并将这个过程进行抽象和封装,以便在多个地方重复使用。HttpClient是.NET Framework和.NET ...

    使用HttpClient调试android接口-通用方法

    在Android开发中,进行网络通信时,我们...在"ccb-ita"这个文件中,可能包含了具体的代码实现或者示例,可以帮助你更好地理解和实践这些概念。记得在使用HttpClient时,遵循最佳实践,以保证网络请求的稳定性和效率。

    轻量级C++实现的httpserver和httpclient

    本项目聚焦于轻量级的C++实现的HTTP服务器(httpserver)和HTTP客户端(httpclient),利用mongoose库作为基础,为开发者提供了一种简单且高效的方法来添加HTTP功能,而无需依赖如libcurl这样的大型库。 HTTP(超...

    httpclient4.4 jar包

    4. `Commons`:这部分包含了一些通用工具类,如编码处理、URL解析等,为HttpClient提供了丰富的辅助功能。 5. `HttpMime`:这个模块提供了处理MIME类型和多部分请求的能力,对于上传文件或处理复杂表单数据非常有用...

    HttpClient.class.php

    在Web开发中,有时候我们需要从远程服务器获取数据或者向其发送数据,此时,`HttpClient` 类提供了一个方便的接口来实现这样的功能。下面我们将深入探讨这个类的一些核心概念和功能。 首先,`HttpClient` 类通常...

    httpclient相关的JAR包4.1.2

    标签“httpclient jar”进一步强调了我们关注的焦点是HttpClient的JAR文件,这是一个包含HttpClient类和资源的归档文件,用于Java应用程序的构建和运行。 在压缩包的文件名称列表中,我们看到了其他几个重要的库: ...

    Angular4 Http

    在`app.module.ts`文件中,导入`HttpClientModule`并将其添加到`@NgModule.imports`数组中: ```typescript import { HttpClientModule } from '@angular/common/http'; @NgModule({ imports: [ // ... ...

    httpClient调用wcf

    7. **依赖库**:压缩包中包含的其他JAR文件(如`commons-collections.jar`、`commons-lang.jar`等)是Apache Commons项目的一部分,它们提供了各种通用的工具类和集合操作,对HttpClient的使用提供了辅助支持。...

    httpclient jar包.zip

    HTTPCore是Apache HttpClient的基础,它提供了低级别的HTTP连接管理和传输实现。这个库包括了对HTTP协议基本元素的抽象,如连接、请求和响应。HTTPCore的主要功能包括: - **连接管理**:处理TCP/IP连接的建立和...

    org.apache.commons.httpclient

    在"org.apache.commons.httpclient"这个库中,包含了多种HTTP协议的实现,如GET、POST、PUT等,以及对HTTPS的支持,便于开发人员构建网络应用。 HttpClient库的核心类是`HttpClient`,它提供了执行HTTP请求的基本...

    httpClient的xml,form,json提交

    这些属性可以通过Java的`Properties`类加载,或者使用Spring Boot的`@ConfigurationProperties`注解来绑定到配置文件。 在处理form数据时,HttpClient允许我们使用`UrlEncodedFormEntity`来编码表单参数,然后将其...

    HTTPClient

    HTTPClient.cpp很可能是实现HTTP客户端逻辑的主要代码文件,包括设置HTTP请求头、构造GET或POST请求、发送数据到服务器、接收服务器响应以及解析返回的HTTP响应等步骤。可能包含的功能有: 1. 创建socket连接:使用...

    commons-httpclient-3.1.jar和commons-codec-1.3.jar

    在描述中提到的"通用静态页面发布引擎"很可能依赖于这两个库来实现HTTP通信,比如下载网页、上传文件或执行其他网络操作。HttpClient处理实际的HTTP交互,而Codec库则可能被用来处理如URL编码、Base64编码等与数据...

    C#通用类数据库连接、日志、http类、json解析、xml、RTX接口调用

    一个通用的日志类应包含写入不同级别的日志(如Error、Info、Debug)和日志输出目标(如控制台、文件、数据库)的功能。 3. **HTTP类**: C#中的System.Net命名空间提供了HttpClient类用于发送HTTP请求。通用的...

    WindowsForm向服务器传文件从服务器下载文件.rar

    在本文中,我们将深入探讨如何使用C#和WindowsForm技术实现文件的上传和下载功能,主要涉及以下几个核心知识点: 1. **C#编程基础**:C#是Microsoft开发的一种面向对象的编程语言,广泛用于Windows应用程序开发,...

    Linux下用c语言实现发送http请求

    在Linux环境下利用C语言实现HTTP请求的发送是一个深入理解网络编程和HTTP协议的好机会。本文将根据提供的代码片段,详细解析如何在Linux下使用C语言实现HTTP请求的发送,包括必要的头文件、函数定义以及主函数中的...

    java工具类 ftp 文件比较 socket http

    在Java中,我们可以使用`java.io`和`java.nio`包下的类来实现文件的比较。例如,`java.io.File`类可以获取文件的基本信息,通过比较文件大小和修改时间进行初步判断。对于内容比较,可以使用`java.nio.file.Files`...

    php实现httpclient类示例

    标题“php实现httpclient类示例”和描述“主要介绍了php实现httpclient类示例,需要的朋友可以参考下”指明了本文的重点在于向PHP开发者介绍如何在PHP中创建一个HTTP客户端类,从而方便地发送HTTP请求并处理响应。...

Global site tag (gtag.js) - Google Analytics