頁面 <!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(); } } }