zoukankan      html  css  js  c++  java
  • 文件的下载

    今天来谈谈文件的下载 

      原理

        我们知道,服务器与浏览器建立的连接其实就是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);
    View Code

       效果示例

     第二种方式 

      这种方式就是说我们自己写代码实现了从服务器发送到客户端的流,这样也可以实现文件的下载

      代码如下  

    //获取请求下载的文件名
            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();
    View Code

      效果图:

      

    第三种 就更加简单了,直接使用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来实现的,

  • 相关阅读:
    iOS——归档对象的创建,数据写入与读取
    iOS——plist的创建,数据写入与读取
    SQL SERVER 2005快捷键
    图片放大源码
    验证url 地址是否是图片
    JS三大经典变量命名法
    载入锁频
    SQL Server 查询分析器键盘快捷方式
    关于ajax get方式请求 url地址参数怎么变成空了的问题
    SQL计算表的列数
  • 原文地址:https://www.cnblogs.com/tzpRoomForLearning/p/7725898.html
Copyright © 2011-2022 走看看