.html代碼
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <h1> 使用<a>標簽的方式實現文件下載 </h1> <a href="/WEB14/download/a.txt">a.txt</a> <br> <a href="/WEB14/download/a.jpg">a.jpg</a> <h1>使用服務器端編碼的方式實現文件下載</h1> <a href="/WEB14/downloadServlet?filename=a.txt">a.txt</a> <br> <a href="/WEB14/downloadServlet?filename=a.jpg">a.jpg</a> <br> <a href="/WEB14/downloadServlet2?filename=你的名字.txt">你的名字</a> </body> </html>
1.DownloadServlet()代碼
package com.hdh.content; import java.io.FileInputStream; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class DownloadServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1.獲取下載文件的名稱 String filename=request.getParameter("filename"); //*告訴客戶端這個文件不是解析 而是以附件的形式下載 response.setHeader("Content-Disposition", "attachment;filename="+filename); //2.獲取文件的絕對路徑 String path=this.getServletContext().getRealPath("download/"+filename); //3.獲得該文件的輸入流 FileInputStream in=new FileInputStream(path); //獲得輸出流---通過response獲得的輸出流 用於向客戶端寫內容 ServletOutputStream out=response.getOutputStream(); //拷貝文件 int len=0; byte [] buffer=new byte[1024]; while((len=in.read(buffer))>0) { out.write(buffer, 0, len); } in.close(); out.close(); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
2.在服務器上運行后出現圖片無法下載而是直接解析:
需要不進行解析而是以附件的形式下載:告訴客戶端這個文件不是解析 而是以附件的形式下載
加上:response.setHeader("Content-Disposition", "attachment;filename="+filename);
package com.hdh.content; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class DownloadServlet2 extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /* * 解決下載 你的名字.txt時亂碼的問題 */ //1.獲取下載文件的名稱 String filename=request.getParameter("filename"); filename=new String(filename.getBytes("ISO8859-1"),"UTF-8"); //*告訴客戶端這個文件不是解析 而是以附件的形式下載 response.setHeader("Content-Disposition", "attachment;filename="+filename); //2.獲取文件的絕對路徑 String path=this.getServletContext().getRealPath("download/"+filename); //3.獲得該文件的輸入流 InputStream in=new FileInputStream(path); //獲得輸出流---通過response獲得的輸出流 用於向客戶端寫內容 ServletOutputStream out=response.getOutputStream(); //拷貝文件 int len=0; byte [] buffer=new byte[1024]; while((len=in.read(buffer))>0) { out.write(buffer, 0, len); } in.close(); out.close(); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
3.如果在獲取中文文件名時,文件名時亂碼問題
filename=new String(filename.getBytes("ISO8859-1"),"UTF-8");