文件的下载
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了文件的下载相关的知识,希望对你有一定的参考价值。
今天来谈谈文件的下载
原理
我们知道,服务器与浏览器建立的连接其实就是socket连接,那么文件的下载呢,也就量这个连接的一段IO流而已,而上传和上载的区别就是一个是
浏览器到服务器,一个是服务器到浏览器,,所以下载的过程就是,浏览器发送请求,服务器收到请求之后,进行响应,通过response响应对象将服
务器上的资源读取到服务器的内存的,然后通过response.getOutputStream()这个方法获取到response可以发送浏览器的输出流,当浏览器接受到响应
时,会判断这个文件是否能够直接解析,如果可以,就会在浏览器直接解析显示,如果不能的话就会提示下载 ,综上所述,我们要实现下载的功能,
只需要做两步 ,1、将请求的资源发送的response的输出流中,2、告诉浏览器不要解析,直接下载
我们接下来会介绍三种实现下载的方式
1、经常使用浏览器的应该知道,在浏览器地址栏可以键入要请求的资源名称,就可以从服务器上直接拿到这个资源 ,甚至不需要我们写IO流的代码,而我要介绍的第一种方式就是这样
代码如下
1 /** 2 * 实现文件下载第一种方式 3 * 通过filter来控制,当请求访问路径最后一段出现了. 4 * 我们认为是在请求打开服务器某一个文件 5 * 这时我们可以设置一个响应头来达到文件下载的目的 6 * 这似乎是我感觉实现下载最简单的 7 * 通过过滤器来实现 8 * @author Administrator 9 * 10 */ 11 HttpServletResponse response = (HttpServletResponse) arg1; 12 HttpServletRequest request = (HttpServletRequest) arg0; 13 //获取请求路径进行切割得到最后一段 14 String str = request.getRequestURI().split("/")[request.getRequestURI().split("/").length-1]; 15 if(str.indexOf(‘.‘)!=-1){ 16 //设置响应头告诉浏览器这是文件下载 17 response.setHeader("content-disposition","attachment;filename="+str); 18 } 19 arg2.doFilter(arg0, arg1);
效果示例
第二种方式
这种方式就是说我们自己写代码实现了从服务器发送到客户端的流,这样也可以实现文件的下载
代码如下
//获取请求下载的文件名 String fileName = request.getParameter("filaName"); fileName = new String (fileName.getBytes("iso-8859-1"),"utf-8"); response.setHeader("content-disposition","attachment;filename="+fileName); System.out.println(fileName); //获取服务器的文件并创建一个读取流 InputStream is = new FileInputStream(getServletContext().getRealPath(fileName)); //创建缓冲数组 byte[] b = new byte[1024*10]; //获取输出流 ServletOutputStream os = response.getOutputStream(); int size = 0; //发送到浏览器 while((size=is.read(b))>0){ os.write(b); } is.close();
效果图:
第三种 就更加简单了,直接使用jar包
代码如下
//获取请求下载的文件名 String fileName = request.getParameter("filaName"); fileName = new String (fileName.getBytes("iso-8859-1"),"utf-8"); response.setHeader("content-disposition","attachment;filename="+fileName); //实例化工具 SmartUpload su = new SmartUpload(); //初始化 su.initialize(this.getServletConfig(),request, response); //设置下载内容不可浏览器自动解析 su.setContentDisposition(null); //开始下载 try { su.downloadFile(fileName); } catch (SmartUploadException e) { // TODO Auto-generated catch block e.printStackTrace(); }
总结下:
文件的下载其实就是IO流的一种操作,换句话说,网络就是基于IO来实现的,
以上是关于文件的下载的主要内容,如果未能解决你的问题,请参考以下文章