Servlet实现文件下载

 

Servlet实现文件下载

下载资源我们在日常中也很常用,它是怎么做到的呢?要能够给别人下载,服务器就应该有这个资源

现在我web站点下有一些资源了
Servlet实现文件下载_第1张图片


浏览器发送所有的请求都是去找Servlet的话,那么我就写一个Servlet,当访问这个Servlet的时候,就可以下载我这个图片资源了!

1、java的文件上传下载都是通过io流来完成的,既然要下载图片,首先要能够读取到,w它。(我这里是指定了具体了存储路径,然后从前端文件列表中将要下载文件的文件名传到ServletDownload,拿到文件具体路径,文件输入流读取资源)

        //获取资源路径
        String name= req.getParameter("fName");
        System.out.println("name: "+name);//比如name=1.jpg
        String path = this.getServletContext().getRealPath("/resource/"+name);
        //文件输入流读取资源
        FileInputStream fileInputStream = new FileInputStream(path);
        //获取文件名
        //substring() 方法返回字符串的子字符串。
        //lastIndexOf() 方法可返回一个指定的字符串值最后出现的位置,
        // 在一个字符串中的指定位置从后向前搜索
        String fileName = path.substring(path.lastIndexOf("\")+1);

告诉浏览器,我要下载这个文件

 //设置消息头,告诉浏览器,我要下载1.png这个图片
 response.setHeader("Content-Disposition", "attachment; filename="+fileName);

3、将读取到的内容回送给浏览器

fileInputStream.read(byte [] b )

从(来源)输入流中(读取内容)读取的一定数量字节数,并将它们存储到(去处)缓冲区数组b中,返回值为实际读取的字节数,运行一次读取一定的数量的字节数.java会尽可能的读取b个字节,但也有可能读取少于b的字节数.至少读取一个字节第一个字节存储读入元素b[0],下一个b[1],等等。读取的字节数是最多等于b的长度.如果没有可用的字节,因为已经到达流的末尾, -1返回的值

        int len = 0;
        byte[] bytes = new byte[1024];
        ServletOutputStream  servletOutputStream = resp.getOutputStream();
        while((len=fileInputStream.read(bytes))>0){
            servletOutputStream.write(bytes, 0, len);
        }
        //关闭资源
        servletOutputStream.close();
        fileInputStream.close();

前端页面我假设这个资源名称都是知道的,很多时候我们都是从数据中获取资源相关信息,然后展示在页面,这里我偷懒就指定具体文件资源了。
 

Servlet实现文件下载_第2张图片

点击要下载的指定文件,就会将文件名fName参数传到Servlet,进行读取下载。

如果我文件的名字是中文呢?

Servlet实现文件下载_第3张图片

发现访问下载,可以下载,但是命名确是乱码,为了解决文件名乱码,我们要进行URL编码,代码如下:

   //resp.setHeader("Content-Disposition", "attachment; filename="+fileName);
   resp.setHeader("Content-Disposition", "attachment; filename="+URLEncoder.encode(fileName,"UTF-8"));

再次访问时,文件名乱码问题就解决了

 

“扫码关注“

Servlet实现文件下载_第4张图片

你可能感兴趣的:(Java)