目录
ResponseEntity可以作为控制器方法的返回值,表示响应 到浏览器的完整的响应报文
使用ResponseEntity实现下载文件的功能
<a th:href="@{/test/down}">下载图片a>
- @Controller
- public class FileUpAndDownController {
- @RequestMapping("/test/down")
- public ResponseEntity<byte[]> testResponseEntity(HttpSession session) throws IOException {
- //获取ServletContext对象
- ServletContext servletContext = session.getServletContext();
- //获取服务器中文件的真实路径
- String realPath = servletContext.getRealPath("img");
- //File.separator:路径分隔符
- realPath = realPath + File.separator + "star.jpeg";
- System.out.println(realPath);
- //创建输入流
- InputStream is = new FileInputStream(realPath);
- //创建字节数组,is.available()获取输入流所对应文件的字节数
- byte[] bytes = new byte[is.available()];
- //将流读到字节数组中
- is.read(bytes);
- //创建HttpHeaders对象设置响应头信息
- MultiValueMap
headers = new HttpHeaders(); - //设置要下载方式以及下载文件的名字,attachment:以附件的方式进行下载,filename设置下载下来时默认的名字
- headers.add("Content-Disposition", "attachment;filename=1.jpeg");
- //设置响应状态码
- HttpStatus statusCode = HttpStatus.OK;
- //创建ResponseEntity对象
- ResponseEntity<byte[]> responseEntity = new ResponseEntity<>(bytes, headers, statusCode);
- //关闭输入流
- is.close();
- return responseEntity;
- }
- }
文件上传要求form表单的请求方式必须为post,并且添加属性enctype="multipart/form-data"
SpringMVC中将上传的文件封装到MultipartFile对象中,通过此对象可以获取文件相关信息
- <form th:action="@{/test/up}" method="post" enctype="multipart/form-data">
- 头像:<input type="file" name="photo"><br>
- <input type="submit" value="上传">
- form>
- <dependency>
- <groupId>commons-fileuploadgroupId>
- <artifactId>commons-fileuploadartifactId>
- <version>1.3.1version>
- dependency>
- <bean
- id="multipartResolver"
- class="org.springframework.web.multipart.commons.CommonsMultipartResolver"
- >
- bean>
- @RequestMapping("/test/up")
- public String testUp(MultipartFile photo,HttpSession session) throws IOException {
- //获取上传的文件的文件名
- String fileName = photo.getOriginalFilename();
- //获取servletContext对象
- ServletContext servletContext = session.getServletContext();
- //获取当前工程photo目录的真实路径
- String photopath = servletContext.getRealPath("photo");
- //创建photopath所对应的File对象
- File file = new File(photopath);
- //判断file所对应目录是否存在
- if (!file.exists()){//如果不存在
- file.mkdir();//创建目录
- }
- String finalPath = photopath + File.separator + fileName;
- //路径 + / + photo + / + 上传的文件名
- //上传文件
- photo.transferTo(new File(finalPath));
- return "success";
- }
重名时,文件中的内容会被覆盖
- @RequestMapping("/test/up")
- public String testUp(MultipartFile photo,HttpSession session) throws IOException {
- //获取上传的文件的文件名
- String fileName = photo.getOriginalFilename();
- //获取上传的文件的后缀名
- String hzName = fileName.substring(fileName.lastIndexOf("."));
- //获取uuid
- String uuid = UUID.randomUUID().toString();
- //拼接一个新的文件名
- fileName = uuid + hzName;
- //获取servletContext对象
- ServletContext servletContext = session.getServletContext();
- //获取当前工程photo目录的真实路径
- String photopath = servletContext.getRealPath("photo");
- //创建photopath所对应的File对象
- File file = new File(photopath);
- //判断file所对应目录是否存在
- if (!file.exists()){//如果不存在
- file.mkdir();//创建目录
- }
- String finalPath = photopath + File.separator + fileName;
- //路径 + / + photo + / + 上传的文件名
- //上传文件
- photo.transferTo(new File(finalPath));
- return "success";
- }