本文最后更新于:2022-10-19T22:58:42+08:00
                  
                  
                
              
            
            
              
                
                文件下载
文件下载有较为固定的套路,代码如下:
| 12
 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对象进行处理,我们后续的处理也是基于此类对象的。因此,我们需要先完成相关配置,让上传的文件能够被封装成该对象。
首先需要添加相关依赖:
| 12
 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对象完成文件上传功能了:
| 12
 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">
 | 
如果需要处理文件重名问题,我们可以随机获取一个不会重复的名称来替换原本的文件名,可以使用如下的方法:
| 12
 3
 4
 
 | String suffixName = filename.substring(filename.lastIndexOf("."));
 
 String newName = UUID.randomUUID().toString() + suffixName;
 
 | 
UUID,全称为Universally Unique
Identifier,通用唯一标识码。它的作用是让分布式系统中的所有元素都能有唯一的标识符,UUID保证对同一时空中的所有资源唯一。我们这里调用Java中UUID的接口,获得一个唯一标识,来解决文件重名的问题。