四、演练下载资源
- 1、直接以超链接的方式下载资源,不写服务器里面的代码
因为Tomcat里面有一个默认的Servlet-DefaultServlet。专门用于处理放在Tomcat服务器里面的静态资源 - 2、自定义servlet下载
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>让Tomcat默认的servlet提供下载</h3>
<a href="Download/aa.jpg">aa.jpg</a>
<a href="Download/bb.txt">bb.txt</a>
<a href="Download/cc.zip">cc.zip</a><br/>
<h3>自定义servlet下载</h3>
<a href="loadServlet?filename=aa.jpg">aa.jpg</a>
<a href="loadServlet?filename=bb.txt">bb.txt</a>
<a href="loadServlet?filename=cc.zip">cc.zip</a>
<a href="loadServlet?filename=测试.zip">测试.zip</a>
</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;
}
}