本节只讨论 使用HttpServletResponse
对象实现文件的下载
文件下载基本步骤:
1.获取文件的绝对路径
2.获取文件名
3.设置content-disposition
响应头控制浏览器 以下载的形式打开文件
4.获取要下载的文件输入流
5.创建数据缓冲区
6.通过response
对象获取OutputStream
流
7.将 文件输入流 写入到 缓冲区
8.使用 OutputStream
将 缓冲区 的数据输出到浏览器
用OutputStream输出文件
代码示例
//获取项目所在文件位置
String path = this.getClass().getClassLoader().getResource("/").getPath()+"//img//路线.png";
// // 查看路径是否正确
// System.out.println(path);
// 获取要下载的文件名 ,需要向后移动一位 ,有 `/`
String filename = path.substring(path.lastIndexOf("//")+1);
// 设置响应头 content-disposition ,并对文件名编码
response.setHeader("content-disposition", "attachment;filename="+filename);
// 获取 文件的 输入流
InputStream inputStream = new FileInputStream(path);
// 创建 数据(byte) 缓冲区
byte[] buffer = new byte[1024];
// 获取 OutputStream 流
OutputStream outputStream = response.getOutputStream();
// 将 inputStream 写入到 buffer 中
while(true) {
// 从 inputStream 中读取最多 1024 个字节(1k) 到 buffer中 ,一次最多读取 1k
// 返回读取的长度
int len = inputStream.read(buffer);
// 判断是否读完
if(len == -1) {
// 关闭 文件流
inputStream.close();
// 跳出
break;
}
//每次往 outputStream 后 添加 从 buffer[0]开始到 buffer[len-1]个字节
//总共 len 个字节
outputStream.write(buffer,0, len);
}
// 结束本次输出
outputStream.flush();
用PrintWriter输出文件
代码示例
public void init(ServletConfig config) throws ServletException {
// this.getServletContext().getRealPath("/") 获取项目绝对路径
// 获取 要下载文件 绝对地址
this.path = this.getServletContext().getRealPath("/")+"//img//路线.png" ;
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
String filename = path.substring(path.lastIndexOf("//")+1);
// 设置响应头 为文件下载
response.setHeader("content-disposition", "attachment;filename="+filename);
// 获取PrintWriter
PrintWriter pWriter = response.getWriter();
// 获取 FileReader ,并读取文件
FileReader fileReader = new FileReader(path);
// 设置字符 输出 每次2个字节 ,可能有转不过的字符
char[] buffer = new char[1024];
while(true) {
// 读取文件
int len = fileReader.read(buffer);
if(len == -1) {
// 读取文件到末尾
fileReader.close();
break;
}
// 写出到返回文件中
pWriter.write(buffer, 0 , len);
}
// 结束写出
pWriter.flush();
}
注意
使用PrintWriter
处理 字节数据,会导致数据丢失
尽可能的使用 OutputStream
来处理文件
因此在编写文件 处理功能时,要使用OutputStream
流(字节流),可以处理任意类型的数据
避免使用PrintWriter
流(字符流),只能处理字符数据,如果用字符流处理字节数据,会导致数据丢失。