一:项目的框架
二:Web前端设计部分
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>downlod01页面</title> </head> <body> <!-- 注意name后面最好不要有空格 不然在servlet页面读取数据的时候会把空格读进去 导致文件路径有问题--> <a href="download01?name=b.ico">下载b站图标</a><br> <a href="download01?name=car.jpg">下载奔驰图标</a> </body> </html>
效果如下:
注意: HTML 中 a标签与Servlet绑定的方式是通过href的值进行绑定的
form表单是通过action的值来进行绑定的
三:Servlet设计部分
package com.whx.servlet; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.FileInputStream; import java.io.IOException; import java.net.URLEncoder; @WebServlet(value = "/download01", name = "DownLoadServlet") public class DownLoadServlet extends HttpServlet { //定义文件下载的目录的路径 private String resourceLocation ="E:\\nginx\\nginx-1.17.2\\html\\"; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //获取从html页面标注的name的信息 String name = req.getParameter("name"); //获取输入流 FileInputStream is = new FileInputStream(resourceLocation + name); //处理中文文件下载的时候,浏览器显示中文的乱码问题 String cnFileName = URLEncoder.encode(name, "utf-8"); //下载需要设置头信息,这是一种固定的模式 resp.setHeader("Content-Disposition","attachment;filename=" + cnFileName); //获取输出流 ServletOutputStream os = resp.getOutputStream(); //在读入数据的时候,同时把数据输出到客户端的html上 int length=0; byte[] bs =new byte[2048]; while (-1 !=(length = is.read(bs))){ os.write(bs,0,length); } os.flush(); os.close(); is.close(); } }
四:注意事项
(1)HTML:
1.HTML中的a标签的href参数是用来绑定相关的servlet的,所以一定要和servlet中注解的值一样
2. a标签中href中值的写法:
name的值会在servlet中被读取,和保存文件的目录拼起来构成下载的绝对路径
<a href="download01?name=b.ico">下载b站图标</a><br> <a href="download01?name=car.jpg">下载奔驰图标</a>
(2)Servlet:
1.在下载操作中,注解只需要一个,即:@WebServlet(参数) 而不需要@MutipartConfig
2.与上传文件操作固定要先获取文件的头信息这一步骤相对应,在下载操作中,需要固定地先设置头信息,这也是一种固定的模式
//下载需要设置头信息,这是一种固定的模式 resp.setHeader("Content-Disposition","attachment;filename=" + cnFileName);
3.流的获取问题
在下载操作中,输出流的获取是通过resp来获取的:
//获取输出流 ServletOutputStream os = resp.getOutputStream();
而在上传操作中,输入的获取是通过Part类对象来获取的:
// 利用part获取文件的输入流 InputStream is = part.getInputStream();
4.编码问题
如果下载的文件的文件名包含中文的话,有可能会出现编码问题,对此我们的解决方法是对文件名进行处理:
//处理中文文件下载的时候,浏览器显示中文的乱码问题 String cnFileName = URLEncoder.encode(name, "utf-8");