文件的下载

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);
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来实现的,

 

以上是关于文件的下载的主要内容,如果未能解决你的问题,请参考以下文章

根据图片的url地址下载图片到本地保存代码片段

片段中的Firebase数据不是持久的,会重新下载

Xamarin Android 片段库

16个必备的JavaScript代码片段

我无法从 firebase 获取下载网址()。请任何人帮助这是我的代码和错误。 (我正在使用片段)[重复]

用于从 cloudkit 检索单列的代码模式/片段