上一节:https://blog.csdn.net/Carl_changxin/article/details/86590409
1、预备知识
(1)输入流和输出流
输入流:实现读取文件;比如FileInputStream类:文件字节输入流,能实现按字节读取文件
输出流:实现写入文件;FileOutputStream类:文件字节输出流,能实现将字节写入文件
参考:https://blog.csdn.net/Carl_changxin/article/details/82886095
(2)文件下载的思路
- 获取文件路径
- 通过文件路径得到输入流,准备读取文件
- 创建输出流
- 执行输出操作
2、代码实现
备注:文件放在src目录下
web.xm配置l如下:
package download;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ServletDownload extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//得到文件路径
String filePath = this.getServletContext().getRealPath("/WEB-INF/classes/大海.jpg");
System.out.println(filePath);
//创建文件的字节输入流
FileInputStream fis = new FileInputStream(filePath);
//创建Servlet的字节输出流
ServletOutputStream sos = resp.getOutputStream();
//获得文件名
String filename = filePath.substring(filePath.lastIndexOf("\\")+1);
System.out.println(filename);
//设置文件名的编码
filename = URLEncoder.encode(filename,"UTF-8");
//通过响应消息头告知客户端要下载文件(文件名,和文件类型的信息要通知)
resp.setHeader("content-disposition", "attachment;filename="+filename);
resp.setHeader("content-type","image/jpeg");
//执行输出操作
int len = 1;
byte[] b = new byte[1024];
while((len=fis.read(b))!=-1) {//fis.read(b)表示每次读取1024个字节;读到数据,则返回字节个数;没有读到数据则返回-1
//一边读取文件,一边用输出流输出文件
sos.write(b, 0, len);
}
sos.close();
fis.close();
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
3、注意
(1)文件路径是指服务器中的文件所在位置,不是按照eclipse的目录结构;
String filePath = this.getServletContext().getRealPath("/WEB-INF/classes/大海.jpg");路径的第一个/表示项目的根目录,即Demo
(2)字符串的操作和转义字符;String filename = filePath.substring(filePath.lastIndexOf("\\")+1);
substring(int beginIndex)返回一个新的字符串,它是此字符串的一个子字符串。如:"unhappy".substring(2) returns "happy",再如:"hamburger".substring(4, 8) returns "urge"左闭右开;转义字符,\\在此处表示\;上面文件路径和文件名打印出来如下
(3)HttpServletResponse设置响应消息头信息
resp.setHeader("content-disposition", "attachment;filename="+filename); resp.setHeader("content-type","image/jpeg");
(4)文件名编码;filename = URLEncoder.encode(filename,"UTF-8");