关于单个文件或多个文件的上传,上一篇博文已经记录了下来,这次聊聊文件的下载。
——@Yelihu2018年9月20日 23:35:58
文件的下载还依然是使用MultipartFile这个组件,关于相关配置文件的配置,上一篇博文已经记录,这里就不在多赘述
功能实现的效果是,进入一个网页的页面,出来一个下载框,就可以下载一个指定的文件,这个文件暂时存放在本地的E盘之下,
实际开发的时候,关于文件的路径和文件的名称,还是要设置为可配置的路径和动态获取的文件名,比如从数据库中读取出文件名和文件路径,这个Demo里面仅为设置了读取文件的路径为E盘。
代码如下:
@RequestMapping(value="/downloadtest")
public String downloadtest(HttpServletResponse response){
//设置字符编码
response.setCharacterEncoding("UTF-8");
//通过输出流写到客户端
//获取文件名字(全名+后缀)(实际开发中应该设置为从数据库中动态获取)
String fileName = "2018线性代数辅导讲义(汤家凤) (1)1537405630070.pdf";
//通过Paths工具类获取一个path对象
Path path = Paths.get(parentPath,fileName);
//判断文件是否存在
if(Files.exists(path)){
System.out.println("文件存在!");
//存在就下载
//通过response设定他的相应类型
//获取文件后缀
String fileSuffix =fileName.substring(fileName.lastIndexOf(".")+1);
//设置contentType,指定该响应类型 即可下载
response.setContentType("application/"+fileSuffix);
//重要!:根据HTTP协议的规范,添加头信息,影响浏览器执行下载的行为
try {
response.addHeader("Content-Disposition","attachment;filename="+new String(fileName.getBytes("utf-8"),"ISO8859-1"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
//通过path写入文件
try {
Files.copy(path,response.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
}
//跳转到响应页面
return "system/plansubmit/download_success";
}
- 首先要字符编码,不然会出现下载的文件文件名中中文部分为空格。
response.setCharacterEncoding("UTF-8"); - 获取文件名,我这里直接定死了是E盘路径下,叫做"2018线性代数辅导讲义(汤家凤) (1)1537405630070.pdf"的pdf文件
- 通过Path获取一个path对象,构造一个Path对象来表示一个文件路径,或者一个文件。
- 截取文件名称的前缀(不包括.pdf部分)
- 判断文件存在之后,根据HTTP协议所指定的响应类型(response.setContentType("application/"+fileSuffix);)
- 重要:根据HTTP协议的规范,添加头信息,影响浏览器执行下载的行为(response.addHeader("Content-Disposition","attachment;filename="+new String(fileName.getBytes("utf-8"),"ISO8859-1")); )
- 通过files下载文件
至此,在跳转到的页面上已经完全能下载到一个存在在E盘的这个指定的pdf文件了。
重点:响应类型的指定,和头信息的指定

本文介绍如何利用SSM框架中的MultipartFile组件实现文件下载功能。通过设置响应编码、获取文件名、判断文件存在并指定HTTP响应类型及头信息,实现在网页上点击即可下载位于本地E盘的指定PDF文件。

3万+

被折叠的 条评论
为什么被折叠?



