java實現檔案的下載
阿新 • • 發佈:2018-11-28
servlet層
package com.atguigu.servlet; import java.io.FileInputStream; import java.io.IOException; import java.net.URLEncoder; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import sun.misc.BASE64Encoder; /** * Servlet implementation class DownLoadServlet */ public class DownLoadServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //處理使用者請求 將音樂傳給使用者 ServletContext context = getServletContext(); String fileName = "haibushiyinweinizhangdebuhaokan.mp3"; //獲取檔案真實路徑 String path = context.getRealPath("/WEB-INF/music/"+fileName); //MIMETYPE: 檔案在伺服器上對應的型別 ,audio/mpeg[瀏覽器和伺服器通過此型別認識mp3檔案] //獲取檔案的mimetype String type = context.getMimeType(fileName); // System.out.println(type); response.setContentType(type); //告訴瀏覽器不要下載檔案【谷歌和火狐如果檔案能夠識別直接開啟】,宣告伺服器給瀏覽器的響應是一個附件 //檔名使用中文[瀏覽器解析會出現亂碼,瀏覽器預設使用ISO8859-1] //URLEncoder.encode(fileName, "UTF-8");解決谷歌和IE的檔名亂碼問題 fileName = "還不是因為0706你們長得不好看.mp3"; String agent = request.getHeader("User-Agent"); System.out.println(agent); //Firefox 請求頭中攜帶有此字串就是火狐瀏覽器 if(agent.contains("Firefox")){ //如果是火狐瀏覽器需要特殊處理[Base64編碼處理檔名] fileName = "=?utf-8?B?"+new BASE64Encoder() .encode(fileName.getBytes("utf-8"))+"?="; }else{ //其他瀏覽器都可以解決 fileName = URLEncoder.encode(fileName, "UTF-8"); } response.setHeader("Content-Disposition", "attachment;filename="+fileName); //1、通過檔案流讀取音樂檔案 FileInputStream fis = new FileInputStream(path); //2、通過輸出流寫給瀏覽器 ServletOutputStream sos = response.getOutputStream(); int len; byte[] b = new byte[1024]; while((len=fis.read(b))!=-1){ sos.write(b, 0, len); } //3、關閉流 sos.close(); fis.close(); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
簡單的jsp頁面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <a href="${pageContext.request.contextPath }/Dasda">還不是因為你長得不好看.mp3</a> <!-- 提供一個超連結 IE可以直接下載 谷歌和火狐是自動播放 mp3許可權-超連結方式任何人都可以直接方法 使用者點選超連結下載檔案的請求交給Servlet處理 -在Servlet中通過流交給瀏覽器: IE將檔案解析顯示到頁面上,谷歌和火狐沒有變化 -需要設定Content-Type:告訴伺服器檔案的型別 --> </body> </html>
我在我的專案中存了一個音樂檔案