客户端用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包很大该怎么实现?能给个实例最好了。
...全文
1011 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服务器均支持 断点下载,也就支持多线程下载。

67,550

社区成员

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

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