1. 通过请求参数,获取要下载的文件名
2. 通过响应头,告诉客户端返回的数据类型
3. 通过响应头,告诉客户端收到的数据是用于下载的
4. 通过文件名,读取要下载的文件内容
5. 通过响应输出流,回传要下载的文件到客户端
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String downloadFileName = req.getParameter("filename"); ServletContext servletContext = getServletContext(); String mimeType = servletContext.getMimeType("/file/" + downloadFileName); resp.setContentType(mimeType); if (req.getHeader("User-Agent").contains("Firefox")) { resp.setHeader("Content-Disposition", "attachment; filename==?UTF-8?B?" + new BASE64Encoder().encode(downloadFileName.getBytes("UTF-8")) + "?="); } else { resp.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(downloadFileName, "UTF-8")); } InputStream resourceAsStream = servletContext.getResourceAsStream("/file/" + downloadFileName); OutputStream outputStream = resp.getOutputStream(); IOUtils.copy(resourceAsStream, outputStream); }