SpringMVC笔记(5)-SpringMVC中文件上传和下载

文件下载

文件下载有较为固定的套路,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@RequestMapping("/testDownLoad")
public ResponseEntity<byte[]> testDownLoad(HttpSession session) throws IOException {
// 获取ServletContext对象
ServletContext servletContext = session.getServletContext();
// 获取服务器中文件的真实路径
String realPath = servletContext.getRealPath("/img/test.png");
// 创建输入流,并将其读入字节数组中
FileInputStream fileInputStream = new FileInputStream(realPath);
byte[] bytes = new byte[fileInputStream.available()];
fileInputStream.read(bytes);
// 创建HttpHeaders对象设置响应头信息
MultiValueMap<String, String> headers = new HttpHeaders();
headers.add("Content-Disposition", "attachment;filename=test.png");
// 设置响应状态码
HttpStatus status = HttpStatus.OK;
// 创建ResponseEntity对象
ResponseEntity<byte[]> responseEntity = new ResponseEntity<>(bytes, headers, status);
// 关闭输入流
fileInputStream.close();

return responseEntity;
}

这里我们的返回值类型为ResponseEntity,它表示响应到浏览器的完整的响应报文。

我们首先需要获取到ServletContext对象,然后获取对应文件的真实路径。这个真实路径实际上就是拼接上当前项目的对应路径。我们将需要文件放在webapp目录下。获取真实路径并读取后,得到字节数组,之后就是创建ResponseEntity对象。在此之前还需要响应头以及响应状态码,在响应头中我们设置了下载方式以及下载文件的名称,响应状态码则为200 OK。

文件上传

在SpringMVC中,对上传的文件都需要封装成MultipartFile对象进行处理,我们后续的处理也是基于此类对象的。因此,我们需要先完成相关配置,让上传的文件能够被封装成该对象。

首先需要添加相关依赖:

1
2
3
4
5
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>

之后在SpringMVC的配置文件中添加相关配置,这里的id固定为multipartResolver

1
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>

之后我们就可以基于MutipartFile对象完成文件上传功能了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@RequestMapping("/testUpload")
public String testUpload(MultipartFile file, HttpSession session) throws IOException {
// 获取上传文件的文件名
String filename = file.getOriginalFilename();

// 获取服务器中目录的路径并进行创建
ServletContext servletContext = session.getServletContext();
String imgPath = servletContext.getRealPath("img");
File imgDir = new File(imgPath);
if (!imgDir.exists()) {
imgDir.mkdir();
}
// 最终保存的文件路径
String finalPath = imgPath + File.separator + filename;
// 实现上传功能
file.transferTo(new File(finalPath));

return "success";
}

需要注意,这里MultipartFile形参的名称需要和上传文件参数中所指定的名称相同,具体来说,需要和下面的name属性相匹配:

1
<input type="file" name="file">

如果需要处理文件重名问题,我们可以随机获取一个不会重复的名称来替换原本的文件名,可以使用如下的方法:

1
2
3
4
// 获取后缀名
String suffixName = filename.substring(filename.lastIndexOf("."));
// 重新命名
String newName = UUID.randomUUID().toString() + suffixName;

UUID,全称为Universally Unique Identifier,通用唯一标识码。它的作用是让分布式系统中的所有元素都能有唯一的标识符,UUID保证对同一时空中的所有资源唯一。我们这里调用Java中UUID的接口,获得一个唯一标识,来解决文件重名的问题。


SpringMVC笔记(5)-SpringMVC中文件上传和下载
http://example.com/2022/10/19/SpringMVC笔记-5-SpringMVC中文件上传和下载/
作者
EverNorif
发布于
2022年10月19日
许可协议