持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第27天,点击查看活动详情
前言
上一篇文章我们使用Spring MVC实现了文件上传,底层的原理的使用了I/O流,Spring MVC进行了封装方便了我们进行操作,这篇文章我们来讲讲Spring MVC的文件下载。
文件下载
原理
文件下载与文件上传的过程相反,服务器通过输入流将本地的文件读取,然后通过输出流和网络请求将文件发送到客户端。
代码示例
1.创建下载页面。
很简单,我们使用一个超链接来实现文件下载的请求。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<a href="/file/download/1">1.png</a>
</body>
</html>
2.然后我们写文件下载相关的请求方法。
@GetMapping("/down")
public String down(){
return "download";
}
@GetMapping("/download/{name}")
public void download(@PathVariable String name, HttpServletRequest request, HttpServletResponse response) throws IOException {
name += ".jpg";
String path = request.getServletContext().getRealPath("file");
File file = new File(path,name);
OutputStream outputStream = null;
if(file.exists()){
response.setContentType("application/forc-download");
response.setHeader("Content-Disposition","attachment;filename="+name);
outputStream = response.getOutputStream();
outputStream.write(FileUtils.readFileToByteArray(file));
outputStream.flush();
if (outputStream != null){
outputStream.close();
}
}
}
代码解析:
前面下载页面使用的是超链接,超链接是GET请求,我们这里写的就是@GetMapping注解,请求路径是使用了一个REST风格传输数据,我们获取下所要下载的文件名。使用@PathVariable注解将文件名的参数从路径中取出并赋值给函数参数列表中定义的name。
我们下载文件首先要去文件所在位置去读取文件,所以我们需要request参数,读取之后我们要做响应,这就需要response参数。
我们取到的name只是文件名,所以我们先要加上文件的后缀名。然后获取文件的绝对路径。取到绝对路径我们就使用File获取这个文件,取到这个文件后我们使用输出流outputStream将文件进行输出。先做个文件是否存在的判断。
response.setContentType("application/forc-download");
response.setHeader("Content-Disposition","attachment;filename="+name);
这里我们进行一些响应的设置文件名为下载后的文件名,我们这里就设置为原文件名。
然后相应内容和输出流进行对接,后面使用输出流进行操作完成文件的写入操作。
这样我们就简单的完成了Spring MVC的文件下载的代码了。我们来测试下能不能成功下载。
下载功能测试
我们要下载的话,需要先上传一个文件。
先进入上传页面进行上传。
点击上传,查看file文件夹中是否有上传的文件。
文件上传成功!
然后我们进入下载页面。
点击超链接进行下载。
选择文件下载位置,点击保存。
我们去看看刚才选择的下载位置中有没有我们下载的图片。
下载成功!
总结
文件上传下载的方式有很多种,Spring MVC对其进行了封装,我们能更加方便的进行操作。Spring MVC文件下载的内容就先讲到这里了。喜欢的小伙伴们多多支持,你们的支持就是我更新的动力。