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); }