请选择 进入手机版 | 继续访问电脑版
本站特色:极好的技术研究氛围!所有技术交流,必有回复!

疯狂Java联盟

 找回密码
 加入联盟
查看: 619|回复: 0

Spring Boot2.0连载(34)-- Spring Boot文件下载

[复制链接]
发表于 2018-5-22 20:47:51 | 显示全部楼层 |阅读模式
更多Spring Boot2.0的知识敬请期待疯狂软件著作《Spring Boot企业应用实战》上市

文件下载比较简单,直接在页面给出一个超链接,该链接href的属性等于要下载文件的文件名,就可以实现文件下载了。但是如果该文件的文件名为中文文件名,在某些早期的浏览器上就会导致下载失败,如果使用最新的Firefox、Opera、Chrome、Safari都可以正常下载文件名为中文的文件了。
Spring MVC提供了一个ResponseEntity类型,可以很方便地定义返回的HttpHeaders和HttpStatus。

FileUploadController.java:

  1. @RequestMapping(value="/download")
  2. public ResponseEntity<byte[]> download(HttpServletRequest request,
  3.          @RequestParam("filename") String filename,
  4.          @RequestHeader("User-Agent") String userAgent,
  5.          Model model)throws Exception{
  6.     // 下载文件路径
  7.     String path = request.getServletContext().getRealPath(
  8.     "/upload/");
  9.     // 构建File
  10.     File file = new File(path+File.separator+ filename);
  11.         // ok表示Http协议中的状态 200
  12.         BodyBuilder builder = ResponseEntity.ok();
  13.         // 内容长度
  14.         builder.contentLength(file.length());
  15.         // application/octet-stream : 二进制流数据(最常见的文件下载)。
  16.         builder.contentType(MediaType.APPLICATION_OCTET_STREAM);
  17.         // 使用URLDecoder.decode对文件名进行解码
  18.         filename = URLEncoder.encode(filename, "UTF-8");
  19.         // 设置实际的响应文件名,告诉浏览器文件要用于【下载】、【保存】attachment 以附件形式
  20.         // 不同的浏览器,处理方式不同,要根据浏览器版本进行区别判断
  21.         if (userAgent.indexOf("MSIE") > 0) {
  22.                 // 如果是IE,只需要用UTF-8字符集进行URL编码即可
  23.                 builder.header("Content-Disposition", "attachment; filename=" + filename);
  24.         } else {
  25.                 // 而FireFox、Chrome等浏览器,则需要说明编码的字符集
  26.                 // 注意filename后面有个*号,在UTF-8后面有两个单引号!
  27.                 builder.header("Content-Disposition", "attachment; filename*=UTF-8''" + filename);
  28.         }
  29.         return builder.body(FileUtils.readFileToByteArray(file));
  30. }
复制代码


download处理方法接收到页面传递的文件名filename后,使用Apache Commons FileUpload组件的FileUtils读取项目的upload文件夹下的该文件,并将其构建成ResponseEntity对象返回客户端下载。
使用ResponseEntity对象,可以很方便地定义返回的BodyBuilder、HttpHeaders和HttpStatus。BodyBuilder对象用来构建返回的Body;HttpHeaders类型代表的是Http协议中的头信息;HttpStatus类型代表的是Http协议中的状态。上面代码中的MediaType,代表的是Internet Media Type,即互联网媒体类型,也叫做MIME类型。在Http协议消息头中,使用Content-Type来表示具体请求中的媒体类型信息。有关BodyBuilder、MediaType和HttpStatus类的详细信息参考Spring MVC的API文档。


单击下载页面的超链接,显示文件下载,如图所示。
图3.19 下载窗口.png
单击“浏览”按钮,选择下载文件保存路径,单击“确定”按钮,文件下载完成。


您需要登录后才可以回帖 登录 | 加入联盟

本版积分规则

微信群请扫二维码
QQ交流1群:
545923995
(未满)

小黑屋|手机版|Archiver|疯狂Java联盟 ( 粤ICP备11094030号 )

GMT+8, 2020-2-22 03:11 , Processed in 0.289703 second(s), 8 queries , File On.

快速回复 返回顶部 返回列表