3. SpringMVC中文件下载

3.1 文件下载的流程

# springmvc中文件下载1. 定义用户将服务器中文件下载到自己本地计算机中过程称之为文件下载2. 开发文件下载1). 定位系统中哪些文件需要用户下载2). 将需要下载文件放入指定下载目录中3). 开发一个页面提供一个文件下载链接4). 开发下载Controller
  1. 开发jsp页面提供一个文件下载链接
<h1>文件下载</h1>
<a href="${pageContext.request.contextPath}/file/download?fileName=aa.txt">aa.txt</a>

  1. 开发下载Controller
@Controller
@RequestMapping("file")
public class FileController {// 用来处理文件下载 请求对应响应输出流@RequestMapping("download")public void download(String fileName, HttpServletRequest request, HttpServletResponse response) throws IOException {System.out.println("下载文件的名称:" + fileName);// 1. 根据下载相对目录获取下载目录在服务器部署之后绝对目录String realPath = request.getSession().getServletContext().getRealPath("/down");// 2. 通过文件输入流读取文件FileInputStream is = new FileInputStream(new File(realPath, fileName));// 3. 获取响应输出流response.setContentType("text/plain;charset=UTF-8");// 4. 附件下载 attachment 附件 inline 在线打开(默认值)response.setHeader("content-disposition", "attachment;fileName=" + fileName);// 5. 处理下载流复制ServletOutputStream os = response.getOutputStream();int len;byte[] b = new byte[1024];while(true){len = is.read(b);if(len == -1) break;os.write(b, 0, len);}// 释放资源os.close();is.close();}
}

测试

3.2 文件下载的细节

  • 在线打开无法打开时,会自动进行附件下载

文件下载有两种形式,一种是直接在页面打开,一种是以附件形式下载

// 4. 附件下载 attachment 附件 inline 在线打开(默认值)
// 在线打开
response.setHeader("content-disposition", inline + ";fileName=" + fileName);
// 附件下载
response.setHeader("content-disposition", attachment + ";fileName=" + fileName);

设置文件下载为在线打开的形式时,如果是浏览器可以打开的类型,比如 txt、png等类型,会直接打开,但是如果是exe等浏览器不能打开的类型时,它会尝试去用自己可以打开的类型(txt、png等)去打开,但是如果还是打不开,它就会以附件下载的形式下载下来。

尝试打开 cc.exe、dd.exe、ee.exe,并设置打开方式为在线打开

@Controller
@RequestMapping("file")
public class FileController {// 用来处理文件下载 请求对应响应输出流@RequestMapping("download")public void download(String openStyle, String fileName, HttpServletRequest request, HttpServletResponse response) throws IOException {openStyle = openStyle == null ? "inline" : "attachment";System.out.println("下载文件的名称:" + fileName);// 1. 根据下载相对目录获取下载目录在服务器部署之后绝对目录String realPath = request.getSession().getServletContext().getRealPath("/down");// 2. 通过文件输入流读取文件FileInputStream is = new FileInputStream(new File(realPath, fileName));// 3. 获取响应输出流response.setContentType("text/plain;charset=UTF-8");// 4. 附件下载 attachment 附件 inline 在线打开(默认值)response.setHeader("content-disposition", "inline" + ";fileName=" + URLEncoder.encode(fileName, "UTF-8"));// response.setHeader("content-disposition", openStyle + ";fileName=" + fileName);ServletOutputStream os = response.getOutputStream();// 5. 处理下载流复制       // 操作io流用IOUtils 操作file用FileUtils// 通过工具类处理下载里复制和关闭流IOUtils.copy(is, os);IOUtils.closeQuietly(is);   // 优雅关闭 安静关流IOUtils.closeQuietly(os);   // 优雅关闭 安静关流// 传统写法/*int len;byte[] b = new byte[1024];while(true){len = is.read(b);if(len == -1) break;os.write(b, 0, len);}// 释放资源os.close();is.close();*/}
}

  • 一般我们在网页进行下载的时候,都会提供两种形式,一种是在线打开,一种是附件下载

upload.jsp文件下载

<h1>文件下载</h1>
<ul><li>aa.txt<a href="${pageContext.request.contextPath}/file/download?fileName=aa.txt">在线打开</a><a href="${pageContext.request.contextPath}/file/download?fileName=aa.txt&openStyle=attch">附件下载</a>    </li><li>cc.exe<a href="${pageContext.request.contextPath}/file/download?fileName=cc.exe">在线打开</a><a href="${pageContext.request.contextPath}/file/download?fileName=cc.exe&openStyle=attch">附件下载</a>  </li><li>dd.exe<a href="${pageContext.request.contextPath}/file/download?fileName=dd.exe">在线打开</a><a href="${pageContext.request.contextPath}/file/download?fileName=dd.exe&openStyle=attch">附件下载</a>  </li>
</ul>

@Controller
@RequestMapping("file")
public class FileController {// 用来处理文件下载 请求对应响应输出流@RequestMapping("download")public void download(String openStyle, String fileName, HttpServletRequest request, HttpServletResponse response) throws IOException {openStyle = openStyle == null ? "inline" : "attachment";System.out.println("下载文件的名称:" + fileName);// 1. 根据下载相对目录获取下载目录在服务器部署之后绝对目录String realPath = request.getSession().getServletContext().getRealPath("/down");// 2. 通过文件输入流读取文件FileInputStream is = new FileInputStream(new File(realPath, fileName));// 3. 获取响应输出流response.setContentType("text/plain;charset=UTF-8");// 4. 附件下载 attachment 附件 inline 在线打开(默认值)//response.setHeader("content-disposition", "inline" + ";fileName=" + URLEncoder.encode(fileName, "UTF-8"));response.setHeader("content-disposition", openStyle + ";fileName=" + fileName);ServletOutputStream os = response.getOutputStream();// 5. 处理下载流复制       // 操作io流用IOUtils 操作file用FileUtils// 通过工具类处理下载里复制和关闭流IOUtils.copy(is, os);IOUtils.closeQuietly(is);   // 优雅关闭 安静关流IOUtils.closeQuietly(os);   // 优雅关闭 安静关流// 传统写法/*int len;byte[] b = new byte[1024];while(true){len = is.read(b);if(len == -1) break;os.write(b, 0, len);}// 释放资源os.close();is.close();*/}
}

  • 处理下载流复制关闭流时我们可以使用工具类去简化代码
// 5. 处理下载流复制       // 操作io流用IOUtils 操作file用FileUtils
// 通过工具类处理下载流复制和关闭流
IOUtils.copy(is, os);
IOUtils.closeQuietly(is);   // 优雅关闭 安静关流
IOUtils.closeQuietly(os);   // 优雅关闭 安静关流
// 传统写法
/*
int len;
byte[] b = new byte[1024];
while(true){len = is.read(b);if(len == -1) break;os.write(b, 0, len);
}
// 释放资源
os.close();
is.close();*/
  • 如果文件名有中文,需要主动进行编码处理
response.setHeader("content-disposition", "inline" + ";fileName=" + URLEncoder.encode(fileName, "UTF-8"));

总结

SpringMVC中文件下载相关推荐

  1. 基于 Nginx XSendfile + SpringMVC 进行文件下载

    转自:http://denger.iteye.com/blog/1014066 基于 Nginx XSendfile + SpringMVC 进行文件下载 PS:经过实际测试,通过 nginx 提供文 ...

  2. SpringMVC,SpringBoot文件下载

    前言 最近严查security, 导致原来暴露出去的s3不能用了,不允许public的s3,暂时的折中方案是自己做跳转.于是需要在SpringMVC中实现文件下载功能. 关于文件存储的设计 文件存储通 ...

  3. SpringMVC中文件的上传和下载

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

  4. SpringMVC中的文件上传与下载,json转换,及三大框架的整合

    文章目录 文件上传 准备一个文件上传的表单 导入文件上传需要的jar包 配置文件上传解析器 编写文件上传的Controller控制器中的代码: 使用ResponseEntity返回值处理文件下载 使用 ...

  5. SpringMVC学习笔记:springMVC中相关细节

    SpringMVC中相关细节 1.什么是MVC? MVC是一种软件架构思想,将软件按照模型.视图.控制器来划分. ①M:模型层:指工程中的javaBean,作用是处理数据.javaBean分为两类:一 ...

  6. SpringMVC 实现文件下载

    SpringMVC 实现文件下载有两种方式: 常规方法 // 下载后的文件名称String filename = new String("xxx.dox","ISO885 ...

  7. SpringBoot中文件下载、拦截器、war包部署、jar包部署

    3. SpringBoot中文件下载 将可以被下载资源放在磁盘的 D:\springbootcodes\springboot_day6\download 路径 这里我们使用jsp开发 引入依赖使tom ...

  8. SpringMVC中数据库链接配置

    从昨天开始一直在纠结数据库链接的问题,现在可以说才从库里面查出数据.这种感觉还是希望和大家分享一下 首先我们来看看我用ecplise创建项目的目录结构: 上面是我的目录结构,和数据库链接的都放在了ap ...

  9. SpringMVC中的拦截器

    SpringMVC中的拦截器 拦截器的作用 Spring MVC 的处理器拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理. 用户可以自己定义一些拦截器来实现 ...

最新文章

  1. UBI系统原理-中【转】
  2. python怎么输出结果_如何在python中打印SQLite查询的结果?
  3. linux 基础命令2
  4. alv 刷新_钜献 | 60小时刷新你的雅思托福成绩!明早9点我们要搞事情了!
  5. win10环境下VTK7.1的编译和Qt调用VTK的详细教程二(VS2013编译支持Qt的VTK库)
  6. yii beforeaction 如何赋值全局变量_前端如何进行用户权限管理
  7. 自家院子里能不能种桃树呢?
  8. ESP32开发板开源啦 ESP32-IOT-KIT全开源物联网开发板
  9. 禁用的灰色文本框、按钮的克星
  10. 聊聊Linux2038年问题
  11. 【最优化方法】K-Means聚类实验:Python实现手写数字图像MNIST分类
  12. Mac小技巧:五秒学会Mac电脑旋转屏幕
  13. ACL Tutorial|开放域问答综述 -- 陈丹琦和Scott
  14. the storage of information of web app
  15. Re23:读论文 How Does NLP Benefit Legal System: A Summary of Legal Artificial Intelligence
  16. 2.5 亿!华为成立新公司
  17. matlab将图片转成eps,【MATLAB】论文图片处理(各种数据图转换成eps格式)
  18. 问题:tomcat启动后,可以访问主页面,但是无法访问dubbo-admin
  19. 客观赋权法的python实现
  20. 005 C语言 编写正方形的面积

热门文章

  1. 浅谈一下如何进行一次数据调研
  2. 编曲鼓音源推荐 编曲怎么编鼓
  3. iOS使用TestFlight进行App构建版本测试
  4. 【黑科技】百度快速收录 快速提升网站权重
  5. 大乱斗的魏晋南北朝梳理
  6. 模拟美萍加密狗--Rockey2虚拟狗(二)
  7. 2008-02-27 日志:博彦科技C#周末班开课提示
  8. 语音识别框架之ESPnet
  9. 整数划分的递归实现算法c语言,整数划分算法原理与实现
  10. 刷圈兔下载_刷圈兔最新版