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 {@Overrideprotected 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文件夹中的文件。