本文最后更新于:2022-10-19T22:58:42+08:00
文件下载
文件下载有较为固定的套路,代码如下:
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 = session.getServletContext(); String realPath = servletContext.getRealPath("/img/test.png"); FileInputStream fileInputStream = new FileInputStream(realPath); byte[] bytes = new byte[fileInputStream.available()]; fileInputStream.read(bytes); MultiValueMap<String, String> headers = new HttpHeaders(); headers.add("Content-Disposition", "attachment;filename=test.png"); HttpStatus status = HttpStatus.OK; 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的接口,获得一个唯一标识,来解决文件重名的问题。