一、概述
1、下载是什么?
下载其实就是向客户端响应字节数据。
把一个文件变成字节数组,然后使用response.getOutputStream()
响应给浏览器。
2、下载的要求:
下载的要求其实可以简要概括成六个字:“两个头一个流 ”。
两个头:分别为Content-Type和Content-Disposition。
Content-Type表示的是你传递给客户端的文件的MIME类型,例如:image/pjpeg。可以通过文件名称调用ServletContext.getMimeType()方法,得到MIME类型。
Content-Disposition的默认值为inline,表示在浏览器窗口中打开。我们要给的值是如下这种格式:attachment;filename=xxx 。在filename=后面跟随的是显示在下载框中的文件名称。
一个流:就是要下载的文件数据。我们自己new一个输入流即可
二、文件下载实例一:
1、在web建一个img包用来放下载内容:
2、在web建一个download.jsp文件
<html>
<head>
<title>下载</title>
</head>
<body>
<img src="img/108.jpg" width="350px" height="180px"><br>
<a href="DownloadController">下载</a>
</body>
</html>
3、我们新建一个项目,并且创建一个DownloadController:
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;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
@WebServlet("/DownloadController")
public class DownloadController extends HttpServlet{
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获得资源绝对路径
String realPath = this.getServletContext().getRealPath("img"+ File.separator + "108.jpg");
// 告诉浏览器进行下载处理!而不是在线打开
resp.setHeader("content-disposition","attachment;filename=108.jpg");
//将读取到的资源写给浏览器
FileInputStream in = new FileInputStream(realPath);
ServletOutputStream out = resp.getOutputStream();
byte[] b = new byte[1024];
int len = 0;
while ((len=in.read(b))!=-1){
out.write(b,0,len);
}
//关闭流
out.close();
in.close();
}
}
4、运行效果
三、文件下载实例二:
如果图片名字是中文他会出现问题,大部分浏览器,使用的都是URL编码。我们要转码
resp.setHeader("content-disposition","attachment;filename="+ URLEncoder.encode(filename,"utf-8"));
1、在原来的download.jsp文件中修改
<html>
<head>
<title>下载</title>
</head>
<body>
<img src="img/108.jpg" width="350px" height="180px"><br>
<!--<a href="DownloadController">下载</a>!-->
<a href="DownloadController?resourcename=img/108.jpg">下载</a><br>
<img src="img/黄昏.jpg" width="350px" height="180px"><br>
<a href="DownloadController?resourcename=img/黄昏.jpg">下载</a><br>
<img src="img/140.png" width="30px" height="30px"><br>
<a href="DownloadController?resourcename=img/UCll.rar">下载</a>
</body>
</html>
2、在实例一3里面加
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;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLEncoder;
@WebServlet("/DownloadController")
public class DownloadController extends HttpServlet{
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//处理乱码
resp.setContentType("text/html;charset=utf-8");
req.setCharacterEncoding("utf-8");
//接收资源的名字,
String resourcename = req.getParameter("resourcename");
//获得资源绝对路径
//String realPath = this.getServletContext().getRealPath("img"+ File.separator + "108.jpg");
String realPath = this.getServletContext().getRealPath(resourcename);
System.out.print(realPath);
//截取文件名
int i = realPath.lastIndexOf(File.separator);
System.out.print(i);
String filename = realPath.substring(i + 1);
System.out.print(filename);
// 告诉浏览器进行下载处理!而不是在线打开
resp.setHeader("content-disposition","attachment;filename="+ URLEncoder.encode(filename,"utf-8"));
//inline在线打开
//resp.setHeader("content-disposition","attachment;filename=108.jpg");
//将读取到的资源写给浏览器
FileInputStream in = new FileInputStream(realPath);
ServletOutputStream out = resp.getOutputStream();
byte[] b = new byte[1024];
int len = 0;
while ((len=in.read(b))!=-1){
out.write(b,0,len);
}
out.close();
in.close();
}
}
3、运行效果