Servlet文件下载
文件下载是将服务器上的资源下载到本地,可以通过两种方式来下载服务器上的资源。第一种是使用超链接来下载,第二种是通过代码来下载。
超链接下载
在HTML或者JSP页面中使用超链接时,可以实现页面之间的跳转,但是当超链接链接的资源时浏览器无法识别的资源时就会自动下载。
当遇到浏览器能够直接处理的文件时,会在浏览器中默认显示出来,比如txt、png、jpg等。当浏览器支持download属性时,也可以通过设置download属性强制浏览器下载文件。
首先我们需要在项目中创建一个下载文件所在的文件夹。

如图所示我们创建了一个download目录,然后准备好一些供下载的文件。

然后需要把包含下载文件的文件夹添加到服务器外部资源设置中。

点击下拉框中的编辑配置菜单

点击“部署”按钮切换到“部署”选项卡,点击该界面中的添加按钮(+号按钮)

点击添加按钮后的界面展示如下图所示

点击“外部源”菜单后的界面展示如下图所示

选择download目录,点击确定按钮

然后依次点击“应用”和“确定”按钮
在web app文件夹下创建一个download.html文件,文件的内容如下
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>文件下载</title>
</head>
<body>
<!--使用超链接联链接浏览器可以识别的资源-->
<a href="download/JavaEE.jpg">JPG图片</a>
<!--使用超链接联链接浏览器无法识别的资源-->
<a href="download/体检报告.rar">rar文件</a>
</body>
</html> 

启动该应用后,在浏览器中输入如下URL:
http://localhost:8080/s001/download.html
界面展示如下图所示

点击“JPG图片”这个超链接后的界面展示如下图所示

点击“rar文件”后的界面展示如下图所示

当给超链接设置了download属性,但是没有设置属性值时,将会使用默认的文件名下载文件。如果设置了download属性的值,就使用设置的值作为下载文件的文件名。
接下来我们使用后台的方式实现文件的下载。
首先我们需要准备一个供下载文件的Servlet类DownloadServlet。
该类的具体内容如下
@WebServlet("/downloadServlet")
public class DownloadServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("文件下载...");
        //设置请求的编码
        request.setCharacterEncoding("UTF-8");
        //获取文件下载路径
        String path = getServletContext().getRealPath("/download/");
        //获取要下载的文件名,设计通过前端界面传递过来
        String fileName = request.getParameter("fileName");
        //参数增加非空判断 trim() 去掉字符串前后的空格
        if (fileName == null || "".equals(fileName.trim())) {
            response.getWriter().write("请输入要下载的文件名!");
            response.getWriter().close();
            return;
        }
        //通过路径得到file对象
        File file = new File(path + fileName);
        //判断file对象是否存在,并且是一个标准文件
        if (file.exists() && file.isFile()) {
            //设置响应类型 该响应指示浏览器将响应视为一个可以下载的文件
            //而不是在浏览器中直接打开
            response.setContentType("application/x-msdownload");
            //设置头信息
            response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
            //得到输入流
            InputStream is = new FileInputStream(file);
            //得到输出流
            ServletOutputStream os = response.getOutputStream();
            //定义byte数组
            byte[] car = new byte[1024];
            //定义长度
            int len = 0;
            //循环输出
            while ((len = is.read(car)) != -1) {
                os.write(car, 0, len);
            }
            //关闭流 释放资源
            os.close();
            is.close();
        } else {
            response.getWriter().write("文件不存在,下载失败");
            response.getWriter().close();
        }
    }
} 
在之前的download.html中添加一个form,将form的action设置为上面创建的Servlet。
该界面更新后的代码如下
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>文件下载</title>
</head>
<body>
<!--使用超链接联链接浏览器可以识别的资源-->
<a href="download/JavaEE.jpg">JPG图片</a>
<!--使用超链接联链接浏览器无法识别的资源-->
<a href="download/体检报告.rar">rar文件</a>
<br>
<form action="downloadServlet">
    文件名:<input type="text" name="fileName" placeholder="请输入要下载的文件名">
    <button>下载</button>
</form>
</body>
</html> 

完成上述工作后,启动该应用
在浏览器中输入如下URL:
http://localhost:8080/s001/download.html
在文本输入框中输入JavaEE.jpg,点击下载按钮,就可以成功下载download文件夹中的文件。




















