客户端用httpclient怎么下载服务器上的文件

shenshengzhiwen 2014-12-11 10:27:20
服务端提供了一个servlet,例如:http://127.0.62.12:4456/download.do.例如在服务器有个包在目录e:/test/tb.zip。 客户端如果如何用httpclient去调用servlet去到服务器的一个目录下下载这个个zip包?servlet该如何写?如果这个zip包很大该怎么实现?能给个实例最好了。
...全文
932 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
猿人林克 2014-12-12
  • 打赏
  • 举报
回复
引用 6 楼 shenshengzhiwen 的回复:
[quote=引用 2 楼 evangelionxb 的回复:] httpclient接收如下


import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

public class ClientA {
	
	public void service(){
		
		String url = "http://192.168.1.121:7503/download/DownloadServlet";
		
		HttpClient client = new DefaultHttpClient();
		HttpGet get = new HttpGet(url);
		
		try {
			
			HttpResponse response = client.execute(get);
			InputStream is = response.getEntity().getContent();
			
			String localfile = "D://aaa.zip";
			File file = new File(localfile);
			if(!file.exists()){
				file.createNewFile();
			}
			
			OutputStream os = new FileOutputStream(file);
			
			int read = 0;
			byte[] temp = new byte[1024*1024];
			
			while((read=is.read(temp))>0){
				byte[] bytes = new byte[read];
				System.arraycopy(temp, 0, bytes, 0, read);
				os.write(bytes);
			}
			os.flush();
		
		} catch (ClientProtocolException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	
	}
	
	public static void main(String[] args) {
		ClientA client = new ClientA();
		client.service();
	}
	
}

可以下载了,就是文件大的时候还得处理一下。[/quote] 文件大了不建议用httpclient,直接ftp拿,不然吞吐量长时间过大的话容易出问题。
shenshengzhiwen 2014-12-12
  • 打赏
  • 举报
回复
引用 2 楼 evangelionxb 的回复:
httpclient接收如下


import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

public class ClientA {
	
	public void service(){
		
		String url = "http://192.168.1.121:7503/download/DownloadServlet";
		
		HttpClient client = new DefaultHttpClient();
		HttpGet get = new HttpGet(url);
		
		try {
			
			HttpResponse response = client.execute(get);
			InputStream is = response.getEntity().getContent();
			
			String localfile = "D://aaa.zip";
			File file = new File(localfile);
			if(!file.exists()){
				file.createNewFile();
			}
			
			OutputStream os = new FileOutputStream(file);
			
			int read = 0;
			byte[] temp = new byte[1024*1024];
			
			while((read=is.read(temp))>0){
				byte[] bytes = new byte[read];
				System.arraycopy(temp, 0, bytes, 0, read);
				os.write(bytes);
			}
			os.flush();
		
		} catch (ClientProtocolException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	
	}
	
	public static void main(String[] args) {
		ClientA client = new ClientA();
		client.service();
	}
	
}

可以下载了,就是文件大的时候还得处理一下。
shenshengzhiwen 2014-12-12
  • 打赏
  • 举报
回复
引用 2 楼 evangelionxb 的回复:
httpclient接收如下


import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

public class ClientA {
	
	public void service(){
		
		String url = "http://192.168.1.121:7503/download/DownloadServlet";
		
		HttpClient client = new DefaultHttpClient();
		HttpGet get = new HttpGet(url);
		
		try {
			
			HttpResponse response = client.execute(get);
			InputStream is = response.getEntity().getContent();
			
			String localfile = "D://aaa.zip";
			File file = new File(localfile);
			if(!file.exists()){
				file.createNewFile();
			}
			
			OutputStream os = new FileOutputStream(file);
			
			int read = 0;
			byte[] temp = new byte[1024*1024];
			
			while((read=is.read(temp))>0){
				byte[] bytes = new byte[read];
				System.arraycopy(temp, 0, bytes, 0, read);
				os.write(bytes);
			}
			os.flush();
		
		} catch (ClientProtocolException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	
	}
	
	public static void main(String[] args) {
		ClientA client = new ClientA();
		client.service();
	}
	
}

经过测试,下载后的文件内容是0KB。是不是哪里出问题了?
shenshengzhiwen 2014-12-12
  • 打赏
  • 举报
回复
引用 3 楼 windsunmoon 的回复:
[quote=引用 1 楼 evangelionxb 的回复:] servlet 如下


import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class DownloadServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    public DownloadServlet() {
        super();
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String filename = "下载.zip";
		String rname = new String(filename.getBytes("utf-8"),"iso-8859-1");
		response.addHeader("Content-Disposition", "attachment;filename="+rname);
		response.setContentType("application/octet-stream");
		
		File file = new File("e://test//tb.zip");
		InputStream is = new BufferedInputStream(new FileInputStream(file));
		byte[] buffer = new byte[is.available()];
		is.read(buffer);
		is.close();
		
		OutputStream os = new BufferedOutputStream(response.getOutputStream());
		os.write(buffer);
		os.flush();
		os.close();
		
	}
	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	
	}

}

byte[] buffer = new byte[is.available()]; is.read(buffer); 这里会不会有问题,文件大的时候读取不玩数据 [/quote]该如何修改呢?
windsunmoon 2014-12-12
  • 打赏
  • 举报
回复
引用 1 楼 evangelionxb 的回复:
servlet 如下


import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class DownloadServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    public DownloadServlet() {
        super();
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String filename = "下载.zip";
		String rname = new String(filename.getBytes("utf-8"),"iso-8859-1");
		response.addHeader("Content-Disposition", "attachment;filename="+rname);
		response.setContentType("application/octet-stream");
		
		File file = new File("e://test//tb.zip");
		InputStream is = new BufferedInputStream(new FileInputStream(file));
		byte[] buffer = new byte[is.available()];
		is.read(buffer);
		is.close();
		
		OutputStream os = new BufferedOutputStream(response.getOutputStream());
		os.write(buffer);
		os.flush();
		os.close();
		
	}
	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	
	}

}

byte[] buffer = new byte[is.available()]; is.read(buffer); 这里会不会有问题,文件大的时候读取不玩数据
evangelionxb 2014-12-12
  • 打赏
  • 举报
回复
httpclient接收如下


import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

public class ClientA {
	
	public void service(){
		
		String url = "http://192.168.1.121:7503/download/DownloadServlet";
		
		HttpClient client = new DefaultHttpClient();
		HttpGet get = new HttpGet(url);
		
		try {
			
			HttpResponse response = client.execute(get);
			InputStream is = response.getEntity().getContent();
			
			String localfile = "D://aaa.zip";
			File file = new File(localfile);
			if(!file.exists()){
				file.createNewFile();
			}
			
			OutputStream os = new FileOutputStream(file);
			
			int read = 0;
			byte[] temp = new byte[1024*1024];
			
			while((read=is.read(temp))>0){
				byte[] bytes = new byte[read];
				System.arraycopy(temp, 0, bytes, 0, read);
				os.write(bytes);
			}
			os.flush();
		
		} catch (ClientProtocolException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	
	}
	
	public static void main(String[] args) {
		ClientA client = new ClientA();
		client.service();
	}
	
}

evangelionxb 2014-12-12
  • 打赏
  • 举报
回复
servlet 如下


import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class DownloadServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    public DownloadServlet() {
        super();
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String filename = "下载.zip";
		String rname = new String(filename.getBytes("utf-8"),"iso-8859-1");
		response.addHeader("Content-Disposition", "attachment;filename="+rname);
		response.setContentType("application/octet-stream");
		
		File file = new File("e://test//tb.zip");
		InputStream is = new BufferedInputStream(new FileInputStream(file));
		byte[] buffer = new byte[is.available()];
		is.read(buffer);
		is.close();
		
		OutputStream os = new BufferedOutputStream(response.getOutputStream());
		os.write(buffer);
		os.flush();
		os.close();
		
	}
	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	
	}

}

windsunmoon 2014-12-12
  • 打赏
  • 举报
回复
引用 9 楼 ooppookid 的回复:
[quote=引用 8 楼 windsunmoon 的回复:] [quote=引用 7 楼 ooppookid 的回复:] [quote=引用 6 楼 shenshengzhiwen 的回复:] [quote=引用 2 楼 evangelionxb 的回复:] httpclient接收如下


import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

public class ClientA {
	
	public void service(){
		
		String url = "http://192.168.1.121:7503/download/DownloadServlet";
		
		HttpClient client = new DefaultHttpClient();
		HttpGet get = new HttpGet(url);
		
		try {
			
			HttpResponse response = client.execute(get);
			InputStream is = response.getEntity().getContent();
			
			String localfile = "D://aaa.zip";
			File file = new File(localfile);
			if(!file.exists()){
				file.createNewFile();
			}
			
			OutputStream os = new FileOutputStream(file);
			
			int read = 0;
			byte[] temp = new byte[1024*1024];
			
			while((read=is.read(temp))>0){
				byte[] bytes = new byte[read];
				System.arraycopy(temp, 0, bytes, 0, read);
				os.write(bytes);
			}
			os.flush();
		
		} catch (ClientProtocolException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	
	}
	
	public static void main(String[] args) {
		ClientA client = new ClientA();
		client.service();
	}
	
}

可以下载了,就是文件大的时候还得处理一下。[/quote] 文件大了不建议用httpclient,直接ftp拿,不然吞吐量长时间过大的话容易出问题。[/quote] 可以多线程下载,断点下载等 其实这个服务端程序完全可以不要的。 httpClient直接访问 文件的Url即可。 一般的web服务器均支持 断点下载,也就支持多线程下载。[/quote] 这不是多线程就能解决的问题,好比说你网速最多就200K,你开100个下载进程,总速度也最多是200K,每个平均2K。多线程对服务器吞吐量毫无意义。长时间大数据读写占用服务器的IO,数据量小还可以,数据量大的话肯定会完蛋。 [/quote] 这倒是,网速是瓶颈。对于哪种方式都一样。
猿人林克 2014-12-12
  • 打赏
  • 举报
回复
引用 8 楼 windsunmoon 的回复:
[quote=引用 7 楼 ooppookid 的回复:] [quote=引用 6 楼 shenshengzhiwen 的回复:] [quote=引用 2 楼 evangelionxb 的回复:] httpclient接收如下


import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

public class ClientA {
	
	public void service(){
		
		String url = "http://192.168.1.121:7503/download/DownloadServlet";
		
		HttpClient client = new DefaultHttpClient();
		HttpGet get = new HttpGet(url);
		
		try {
			
			HttpResponse response = client.execute(get);
			InputStream is = response.getEntity().getContent();
			
			String localfile = "D://aaa.zip";
			File file = new File(localfile);
			if(!file.exists()){
				file.createNewFile();
			}
			
			OutputStream os = new FileOutputStream(file);
			
			int read = 0;
			byte[] temp = new byte[1024*1024];
			
			while((read=is.read(temp))>0){
				byte[] bytes = new byte[read];
				System.arraycopy(temp, 0, bytes, 0, read);
				os.write(bytes);
			}
			os.flush();
		
		} catch (ClientProtocolException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	
	}
	
	public static void main(String[] args) {
		ClientA client = new ClientA();
		client.service();
	}
	
}

可以下载了,就是文件大的时候还得处理一下。[/quote] 文件大了不建议用httpclient,直接ftp拿,不然吞吐量长时间过大的话容易出问题。[/quote] 可以多线程下载,断点下载等 其实这个服务端程序完全可以不要的。 httpClient直接访问 文件的Url即可。 一般的web服务器均支持 断点下载,也就支持多线程下载。[/quote] 这不是多线程就能解决的问题,好比说你网速最多就200K,你开100个下载进程,总速度也最多是200K,每个平均2K。多线程对服务器吞吐量毫无意义。长时间大数据读写占用服务器的IO,数据量小还可以,数据量大的话肯定会完蛋。
windsunmoon 2014-12-12
  • 打赏
  • 举报
回复
引用 7 楼 ooppookid 的回复:
[quote=引用 6 楼 shenshengzhiwen 的回复:] [quote=引用 2 楼 evangelionxb 的回复:] httpclient接收如下


import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

public class ClientA {
	
	public void service(){
		
		String url = "http://192.168.1.121:7503/download/DownloadServlet";
		
		HttpClient client = new DefaultHttpClient();
		HttpGet get = new HttpGet(url);
		
		try {
			
			HttpResponse response = client.execute(get);
			InputStream is = response.getEntity().getContent();
			
			String localfile = "D://aaa.zip";
			File file = new File(localfile);
			if(!file.exists()){
				file.createNewFile();
			}
			
			OutputStream os = new FileOutputStream(file);
			
			int read = 0;
			byte[] temp = new byte[1024*1024];
			
			while((read=is.read(temp))>0){
				byte[] bytes = new byte[read];
				System.arraycopy(temp, 0, bytes, 0, read);
				os.write(bytes);
			}
			os.flush();
		
		} catch (ClientProtocolException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	
	}
	
	public static void main(String[] args) {
		ClientA client = new ClientA();
		client.service();
	}
	
}

可以下载了,就是文件大的时候还得处理一下。[/quote] 文件大了不建议用httpclient,直接ftp拿,不然吞吐量长时间过大的话容易出问题。[/quote] 可以多线程下载,断点下载等 其实这个服务端程序完全可以不要的。 httpClient直接访问 文件的Url即可。 一般的web服务器均支持 断点下载,也就支持多线程下载。
http://www.xd-tech.com.cn/blog/article.asp?id=34一般的情况下我们都是使用IE或者Navigator浏览器来访问一个WEB服务器,用来浏览页面查看信息或者提交一些数据等等。所访问的这些页面有的仅仅是一些普通的页面,有的需要用户登录后方可使用,或者需要认证以及是一些通过加密方式传输,例如HTTPS。目前我们使用的浏览器处理这些情况都不会构成问题。不过你可能在某些时候需要通过程序来访问这样的一些页面,比如从别人的网页中“偷”一些数据;利用某些站点提供的页面来完成某种功能,例如说我们想知道某个手机号码的归属地而我们自己又没有这样的数据,因此只好借助其他公司已有的网站来完成这个功能,这个时候我们需要向网页提交手机号码并从返回的页面中解析出我们想要的数据来。如果对方仅仅是一个很简单的页面,那我们的程序会很简单,本文也就没有必要大张旗鼓的在这里浪费口舌。但是考虑到一些服务授权的问题,很多公司提供的页面往往并不是可以通过一个简单的URL就可以访问的,而必须经过注册然后登录后方可使用提供服务的页面,这个时候就涉及到COOKIE问题的处理。我们知道目前流行的***页技术例如ASP、JSP无不是通过COOKIE来处理会话信息的。为了使我们的程序能使用别人所提供的服务页面,就要求程序首先登录后再访问服务页面,这过程就需要自行处理cookie,想想当你用java.net.HttpURLConnection来完成这些功能时是多么恐怖的事情啊!况且这仅仅是我们所说的顽固的WEB服务器中的一个很常见的“顽固”!再有如通过HTTP来上传文件呢?不需要头疼,这些问题有了“它”就很容易解决了! 我们不可能列举所有可能的顽固,我们会针对几种最常见的问题进行处理。当然了,正如前面说到的,如果我们自己使用java.net.HttpURLConnection来搞定这些问题是很恐怖的事情,因此在开始之前我们先要介绍一下一个开放源码的项目,这个项目就是Apache开源组织中的httpclient,它隶属于Jakarta的commons项目,目前的版本是2.0RC2。commons下本来已经有一个net的子项目,但是又把httpclient单独提出来,可见http服务器的访问绝非易事。Commons-httpclient项目就是专门设计来简化HTTP客户端服务器进行各种通讯编程。通过它可以让原来很头疼的事情现在轻松的解决,例如你不再管是HTTP或者HTTPS的通讯方式,告诉它你想使用HTTPS方式,剩下的事情交给httpclient替你完成。本文会针对我们在编写HTTP客户端程序时经常碰到的几个问题进行分别介绍如何使用httpclient来解决它们,为了让读者更快的熟悉这个项目我们最开始先给出一个简单的例子来读取一个网页的内容,然后循序渐进解决掉前进中的所形侍狻?/font>

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧