1. 程式人生 > >java實現檔案的下載

java實現檔案的下載

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>

我在我的專案中存了一個音樂檔案