文件下载可以说是网站的基础功能,要实现最下载功能,有一种最基本的方法,那就是将超链接的href属性指向对应的资源文件。
如下面连接指向了百度首页的图片:
但这种方式的缺陷也是很明显的,目录信息被获取,不利于信息安全。其实信息安全还是其次,主要还是因为它不方便。如果直接指向资源文件,那么浏览器会自动打开图片等一些文件,而不会弹出窗口提示用户保存。
因此这种方式并不能很好地解决下载的问题。因此就有了下面的几种下载方式。
而在Java中,要实现下载功能一般有三种实现方式:
1、使用Servlet实现文件下载
2、在Struts中用Servlet实现下载
3、使用Struts框架提供的文件下载功能
其实这三种实现方式的原理都一样,都是利用InputStream从文件中读取数据,然后利用OutputStream将数据接入到返回客户端的response中。
其核心代码如下:
1 try { 2 InputStream inStream = new FileInputStream(file); 3 ServletOutputStream servletOS = response.getOutputStream(); 4 byte[] buf = new byte[4096]; 5 int readLength; 6 while((readLength = inStream.read(buf))!= -1) 7 { 8 servletOS.write(buf, 0, readLength); 9 } 10 inStream.close(); 11 servletOS.flush(); 12 servletOS.close(); 13 } 14 catch(Exception e) 15 { 16 e.printStackTrace(); 17 } 18 return response;
其中第一种在Servlet中实现文件下载是最原始的下载方式。而第二种在Struts中用Servlet实现文件下载也是最原始的方式,只不过我们是在Struts的Action中进行操作,不用去创建Servlet。
而第三种则是Struts对文件下载功能进行了封装,我们只要按照其规定的配置就可以直接使用。
这几种方式各有各的优缺点,选择适合自己的方式即可。下面对上面提到的三种方式进行详细解析:
一、使用Servlet实现文件下载
这种方式性能最好,条理最清晰,但是可能代码量多了点。
准备:只需Java的JDK即可运行。
1、在web.xml中进行Servlet配置
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app version="2.5" 3 xmlns="http://java.sun.com/xml/ns/javaee" 4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 6 http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 7 8 <!-- 文件下载 --> 9 <servlet> 10 <servlet-name>fileDownLoadServlet</servlet-name> 11 <servlet-class>com.chanshuyi.download.FileDownLoadServlet</servlet-class> 12 </servlet> 13 <servlet-mapping> 14 <servlet-name>fileDownLoadServlet</servlet-name> 15 <url-pattern>/fileDownLoadServlet</url-pattern> 16 </servlet-mapping> 17 </web-app>