SpringMVC09 - 文件的下载与上传

文件下载

ResponseEntity用于控制器方法的返回值类型,该控制器方法的返回值就是响应到浏览器的响应报文使用ResponseEntity实现下载文件的功能

①浏览器触发下载
<a th:href="@{/test/down}">下载图片</a>
②控制器方法
@RequestMapping("/test/down")
public ResponseEntity<byte[]> testResponseEntity(HttpSession session) throws IOException {
    //获取ServletContext对象
    ServletContext servletContext = session.getServletContext();
    
    //获取服务器中文件的真实路径
    String realPath = servletContext.getRealPath("/static/img/1.jpg");
    
    //创建输入流
    InputStream is = new FileInputStream(realPath);
    
    //创建字节数组,is.available()获取输入流所对应文件的字节数
    byte[] bytes = new byte[is.available()];
    
    //将流读到字节数组中
    is.read(bytes);
    
    //创建HttpHeaders对象设置响应头信息
    MultiValueMap<String, String> headers = new HttpHeaders();
    
    //设置要下载方式以及下载文件的名字
    headers.add("Content-Disposition", "attachment;filename=1.jpg");
    
    //设置响应状态码
    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对象中,通过此对象可以获取文件相关信息

上传步骤:

①添加依赖:
<!--https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload-->
<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.1</version>
</dependency>
②在SpringMVC的配置文件中添加配置:
<!--必须通过文件解析器的解析才能将文件转换为MultipartFile对象,id 和 class 都是固定的-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"></bean>
③浏览器上传文件
<form th:action="@{/test/up}" method="post" enctype="multipart/form-data">
    头像:<input type="file" name="photo"><br>
    <input type="submit" value="上传">
</form>
④控制器方法:
@RequestMapping("/testUp")
public String testUp(MultipartFile photo, HttpSession session) throws IOException {
    //获取上传的文件的文件名
    String fileName = photo.getOriginalFilename();
    
    //处理文件重名问题
    String hzName = fileName.substring(fileName.lastIndexOf("."));
    fileName = UUID.randomUUID().toString() + hzName;
    
    //获取服务器中photo目录的路径
    ServletContext servletContext = session.getServletContext();
    String photoPath = servletContext.getRealPath("photo");
    
    //创建photoPath对应的文件对象
    File file = new File(photoPath);
    
    //判断 file目录是否存在
    if(!file.exists()){
    	file.mkdir();
    }
    String finalPath = photoPath + File.separator + fileName;
    
    //实现上传功能
    photo.transferTo(new File(finalPath));
    
    return "success";
}
posted @   LaViez  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
点击右上角即可分享
微信分享提示