文件下载
用流的形式下载文件
- 前台
- Controller层
- 下载工具类
创建文件
在WEB-INFO下创建文件
前台Html
在前台将文件名传入后台:
<body>
<form action="downFileInfo.do" method="post">
<input type="hidden" name="fileName" value="需求.docx">
<input type="submit" value="下载文件">
</form>
</body>
后台Controller层
获取文件名,再将文件名出入到下载工具类:
@RequestMapping("downFileInfo.do")
public void downFile(HttpServletRequest request,
HttpServletResponse response) throws IOException {
// 获取从前台传递的文件名称
String Name = request.getParameter("fileName");
// 解决乱码
String fileName = new String(Name.getBytes("iso8859-1"), "utf-8");
// System.out.println(fileName);
// System.out.println(request.getSession().getServletContext().getRealPath("/WEB-INF/file"));
try {
// 调用下载工具类,实现下载
DownFileUtil.downFile(request, response, fileName);
} catch (ServletException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
下载文件工具类
下载实现(文件流) 如果文件上传的时候将文件路径存在数据库中,获取文件路径的时候就可以通过service层来获取买然后传进来。再拼接文件路径:
public static void downFile(HttpServletRequest request,
HttpServletResponse response, String fileName)
throws ServletException, IOException {
// 文件路径,文件名,可以从数据库中获取,
// 文件所在目录路径
String filePath = request.getSession().getServletContext()
.getRealPath("/WEB-INF/file");
// 获取文件
File file = new File(filePath + "/" + fileName);
System.out.println(file);
if (!file.exists()) {
System.out.println("没有找到该文件!");
// 如果文件不存在就退出
return;
}
FileInputStream fileInputStream = new FileInputStream(file);
// 设置Http响应 让浏览器下载这个文件
response.setHeader("Content-Disposition", "attachment;Filename="
+ new String(fileName.getBytes(), "iso-8859-1"));
OutputStream outputStream = response.getOutputStream();
byte[] bytes = new byte[2048];
int len = 0;
while ((len = fileInputStream.read(bytes)) > 0) {
outputStream.write(bytes, 0, len);
}
fileInputStream.close();
outputStream.close();
}
效果
结语
前段时间有个优快云的小伙伴,问我下载一个Excel文件,是不是需要poi,
然后我问他如果下载不是下载excel文件呢?
我们在想问题的时候一定不能想得太片面。
下载本质还是流的操作,
注意:朋友们在项目或者学习中使用到流一定要考虑到关闭流。