实现servlet的文件下载(处理中文乱码)

四、演练下载资源

  • 1、直接以超链接的方式下载资源,不写服务器里面的代码
    因为Tomcat里面有一个默认的Servlet-DefaultServlet。专门用于处理放在Tomcat服务器里面的静态资源
  • 2、自定义servlet下载

<html>
<head>
<meta charset="UTF-8">
<title>Insert title heretitle>
head>
<body>
	<h3>让Tomcat默认的servlet提供下载h3>
	<a href="Download/aa.jpg">aa.jpga>
	<a href="Download/bb.txt">bb.txta>
	<a href="Download/cc.zip">cc.zipa><br/>
	
	<h3>自定义servlet下载h3>
	<a href="loadServlet?filename=aa.jpg">aa.jpga>
	<a href="loadServlet?filename=bb.txt">bb.txta>
	<a href="loadServlet?filename=cc.zip">cc.zipa>
	<a href="loadServlet?filename=测试.zip">测试.zipa>
body>
html>

loadServlet实现:

import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/loadServlet")
public class downloadServletTest extends HttpServlet{
	@SuppressWarnings("resource")
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//1、获取要下载的文件的名字
		String filename = req.getParameter("filename");
		//2、找到文件的绝对路径
		String path = getServletContext().getRealPath("Download/"+filename);
		
		/**
		 * 当下载文件有中文时解决乱码问题
		 * 如果是火狐浏览器,用base64解码
		 * 其他都是urlencoding去解码
		 */
		String clientType = req.getHeader("User-Agent");
		if(clientType.equals("Firebox")) {
			filename=FireBoxEncoding.base64EncodingFileName(filename);
		}else {
			filename=URLEncoder.encode(filename, "UTF-8");
		}
		
		//让浏览器找到这份资源时,提示用户下载而不是直接打开
		resp.setHeader("Content-Disposition", "attachment; filename="+filename);
		
		//3、以流的方式去读取资源
		FileInputStream in = new FileInputStream(path);
		OutputStream out = resp.getOutputStream();
		//4、拷贝文件(下载)
		int length=0;
		byte [] buffer=new byte[1024];
		while((length=in.read(buffer))!=-1) {
			out.write(buffer,0,length);
		}
		//5、关闭流
		out.close();
		in.close();
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPost(req, resp);
	}
}

如果是火狐浏览器,用base64进行解码:

import java.io.UnsupportedEncodingException;
import sun.misc.BASE64Encoder;

public class FireBoxEncoding {
	public static String base64EncodingFileName(String filename) {
		BASE64Encoder base64Encoder=new BASE64Encoder();
		try {
			filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
		} catch (UnsupportedEncodingException e) {
			
			e.printStackTrace();
		}
		return filename;
	}
}

你可能感兴趣的:(Java学习)