要实现文件的下载,我们很清楚就会想到HttpServletResponse类向客户端写数据的方法,该类没有向外写数据的方法,于是我们找到其父类ServletResponse,父类中有如下两个方法:
//文件流
public ServletOutputStream getOutputStream() throws IOException;
//字符流
public PrintWriter getWriter() throws IOException;
两者的区别就是,前者是以二进制数据流传递,后者是字符流传递,前者可用来处理各类文件,而后者处理非文本文件时就可能会出现问题。
实现下载文件,无疑就是想客户端写回文件数据流,一般就采用getOutputStream()方法,向客户端写回数据。
具体步骤如下:
- 获取下载文件的路径
- 下载的文件名
- 让浏览器支持下载的功能
- 创建下载文件的输入流
- 创建缓冲区
- 获取输出流对象
- 将文件流写入缓冲区,输出流对象将缓冲区中的数据再写入客户端
- 关闭流对象
具体编码如下:
package cn.ara.servlet;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLEncoder;
public class FileDownLoadServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1. 获取下载文件的路径
String realPath = this.getServletContext().getRealPath("WEB-INF\\classes\\比心.gif");
//2. 下载的文件名
String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);
//3. 让浏览器支持下载的功能
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName,"UTF-8"));
//4. 创建下载文件的输入流
FileInputStream fileInputStream = new FileInputStream(realPath);
//5. 创建缓冲区
int len = 0;
byte[] buffer = new byte[1024];
//6. 获取输出流对象
ServletOutputStream outputStream = response.getOutputStream();
//7. 将文件流写入缓冲区,输出流对象将缓冲区中的数据再写入客户端。
while ((len = fileInputStream.read(buffer)) > 0) {
outputStream.write(buffer, 0, len);
}
//8.关闭流对象
outputStream.close();
fileInputStream.close();
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
文件所在路径:
在web.xml文件中添加:
<servlet>
<servlet-name>FileDownLoadServlet</servlet-name>
<servlet-class>cn.ara.servlet.FileDownLoadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FileDownLoadServlet</servlet-name>
<url-pattern>/fileDownLoad</url-pattern>
</servlet-mapping>
然后开启服务器,在浏览器中访问该路径,就会出现下载文件的提示:
到此,就实现了简单的文件下载。