页面 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <a href="/downloadServlet01?filename=1.jpg">1.jpg</a><br/> <a href="/downloadServlet01?filename=2.txt">2.txt</a><br/> <a href="/downloadServlet01?filename=3.zip">3.zip</a><br/> <a href="/downloadServlet01?filename=刘亦菲.jpg">刘亦菲.jpg</a><br/> </body> </html>
package com.itheima.sh.web; import java.net.URLEncoder; import javax.servlet.ServletContext; 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.File; import java.io.FileInputStream; import java.io.IOException; @WebServlet("/downloadServlet01") public class DownloadServlet01 extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //解决乱码.请求乱码和相应乱码 request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); //获取文件 String filename = request.getParameter("filename"); //定义一个全局域 ServletContext servletContext = getServletContext(); //获取绝对路径(注该路径在WEB-INF下面) String realPath = servletContext.getRealPath("WEB-INF//"+filename); //获取路径的文件 String mimeType = servletContext.getMimeType(filename); //定义一个file File file = new File(realPath); //如果文件存在的话 if(file.exists()){ //如果存在的话,就获取两个头和两个流 //两个头已经存在 String encodeName = URLEncoder.encode(filename, "utf-8"); // response.setHeader("content-disposition", "attachment;filename=" + name); //attechment文件是下载,不写的话就是浏览器打开. response.setHeader("content-disposition", "attachment;filename=" + encodeName); //获取文件类型 response.setContentType(mimeType); //创建字节输入流对象关联服务器的文件 FileInputStream fis = new FileInputStream(file); //创建输入流向浏览器中写出数据 ServletOutputStream os = response.getOutputStream(); //拷贝数据 byte[] buf = new byte[1024]; int len = 0; while((len=fis.read(buf))!=-1){ os.write(buf,0,len); } //释放资源 os.close(); fis.close(); } } }