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>

我在我的项目中存了一个音乐文件

猜你喜欢

转载自blog.csdn.net/weixin_42630877/article/details/84303227