下載的文件,不能隨便的被訪問,放在外面的文件夾肯定不行,url一敲就能訪問了,所以我們要放在WEB-INF文件夾里面,WEB-INF文件夾只有Servlet才能訪問,我們新建一個文件夾,叫download里面我放了三個文件,一個zip,一個exe,一個png,如圖:
我新建了一個JSP
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>下載文件</title> </head> <body> <h3>下載文件</h3> <a href="/download?filename=ColorPix_CHS.zip">ColorPix_CHS.zip</a><br> <a href="/download?filename=QQ9.0.4.exe">QQ9.0.4.exe</a><br> <a href="/download?filename=小女孩.png">小女孩.png</a><br> </body> </html>
一個Servlet
package com.vae.download; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.net.URLEncoder; import java.nio.file.Files; import java.nio.file.Paths; @WebServlet("/download") public class DownloadServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //1.檢查權限,檢查積分或者什么什么幣,這個不講 //2.獲取下載的資源文件的名稱,並且進行轉碼,轉碼是為了讓你的中文文件顯示的時候不亂碼,但是我不轉碼也沒亂碼 String filename = req.getParameter("filename"); filename=new String(filename.getBytes("ISO-8859-1"),"UTF-8"); //3.從服務器中獲取想下載的文件的絕對路徑 String realPath=super.getServletContext().getRealPath("/WEB-INF/download/"+filename); //4.告訴瀏覽器不要打開文件,直接下載,原因是IE6會直接打開文件,所以這個算是特意為IE6設置的 resp.setContentType("application/x-msdownload"); //5.設置下載文件的時候,文件名稱應該是文件自己本身的名稱,因為默認的下載名稱的down String userAgent=req.getHeader("User-Agent"); if (userAgent.contains("MSIE")) { //如果是IE瀏覽器,是這種編碼格式 filename=URLEncoder.encode(filename,"UTF-8"); }else { //非IE瀏覽器,是這種編碼格式 filename=new String(filename.getBytes("UTF-8"),"ISO-8859-1"); } resp.setHeader("Content-Disposition","attachment;filename="+filename); //6.下載文件 Files.copy(Paths.get(realPath),resp.getOutputStream()); } }
需要講解的都在注釋里面了