目录
在javaWeb中,处理文件上传下载还是挺麻烦的,但是在springmvc中就简单很多了,下面来进行介绍。
springmvc实现了MultiPartResolver接口,所以可以对上传的文件进行解析,实现这个接口的是CommonsMultiPartResolver
在springmvc中,默认是没有启用这个文件上传类的,我们需要将其配置进去
<bean class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>
下面,我们在web目录下面建一个文件夹,里面随便放一个文件,不然out目录可能并不会生成该目录
然后就是创建对应的handler
- @RequestMapping("/upload")
- public String upload(@RequestParam("file") MultipartFile uploadFile, HttpServletRequest request) throws IOException {
- //获取文件名称
- String filename = uploadFile.getOriginalFilename();
- //得到保存的路径
- String savePath = request.getServletContext().getRealPath("/file/" + filename);
- System.out.println(savePath);
- //创建文件
- File file = new File(savePath);
- if (!file.exists() && !file.createNewFile())return "fail";
- //转存文件
- uploadFile.transferTo(file);
- return "success";
- }
解释一下,我们提交的文件使用MultipartFile来进行接受,然后进行转存就行。
来测试一下,使用postman进行测试
注意:需要将提交格式设置为mutilpart/form-data。如果是前端使用form表单进行提交,通过设置enctype就行
提交后后端成功接收到图片
文件下载就是通过返回一个ReponseEntity来完成的,注意:需要给该方法标识为@ResponseBody,因为我在类上使用了@RestController,所以就不用标识了。
- @RequestMapping("/download")
- public ResponseEntity<byte[]> download(){
-
- return null;
- }
ResponseEntity里面的类型我们填写的是byte[],就是表示返回的文件是二进制的。接下来我们就需要构建一个ResponseBody进行返回,下面为该类的构造器
很明显,body就是我们要返回的二进制文件,header和status就是响应头和响应体,下面就是最终的代码
- @RequestMapping("/download")
- public ResponseEntity<byte[]> download(HttpServletRequest request) throws IOException {
- //返回的文件名称
- String fileName = "3.jpg";
- //文件绝对路径
- String realPath = request.getServletContext().getRealPath("/file/" + fileName);
- //输入流
- InputStream inputStream = new FileInputStream(realPath);
- //根据文件大小构建byte[]数组
- byte[] bytes = new byte[inputStream.available()];
- //读数据
- inputStream.read(bytes);
- //创建Headers
- HttpHeaders headers = new HttpHeaders();
- //告诉游览器返回的是文件
- headers.add("Content-Disposition", "attachment;filename=" + fileName);
- //创建Status,HttpStatus.OK就是表示200
- HttpStatus status = HttpStatus.OK;
- return new ResponseEntity<>(bytes, headers, status);
- }
游览器进行访问
成功实现功能。
上面就是上传下载的方法,很简单,大家根据自己需要进行扩展即可