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