这里有新鲜出炉的精品教程,程序狗速度看过来!
Spring 是什么呢?首先它是一个开源的项目,而且目前非常活跃;它是一个基于 IOC 和 AOP 的构架多层 j2ee 系统的框架,但它不强迫你必须在每一层 中必须使用 Spring,因为它模块化的很好,允许你根据自己的需要选择使用它的某一个模块;它实现了很优雅的 MVC,对不同的数据访问技术提供了统一的接口,采用 IOC 使得可以很容易的实现 bean 的装配,提供了简洁的 AOP 并据此实现 Transcation Managment,等等
这篇文章主要介绍了 Spring MVC 的文件下载实例详解的相关资料, 需要的朋友可以参考下
Spring MVC 的文件下载实例详解
读取文件
要下载文件,首先是将文件内容读取进来,使用字节数组存储起来,这里使用 spring 里面的工具类实现
- import org.springframework.util.FileCopyUtils;
- public byte[] downloadFile(String fileName) {
- byte[] res = new byte[0];
- try {
- File file = new File(BACKUP_FILE_PATH, fileName);
- if (file.exists() && !file.isDirectory()) {
- res = FileCopyUtils.copyToByteArray(file);
- }
- } catch(IOException e) {
- logger.error(e.getMessage());
- }
- return res;
- }
这个数组就是文件的内容,后面将输出到响应,供浏览器下载
下载文件的响应
下载文件的响应头和一般的响应头是有所区别的,而这里面还要根据用户浏览器的不同区别对待
我把生成响应的代码封装成了一个方法,这样所有下载响应都可以调用这个方法了,避免重复代码到处写
- protected ResponseEntity < byte[] > downloadResponse(byte[] body, String fileName) {
- HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
- String header = request.getHeader("User-Agent").toUpperCase();
- HttpStatus status = HttpStatus.CREATED;
- try {
- if (header.contains("MSIE") || header.contains("TRIDENT") || header.contains("EDGE")) {
- fileName = URLEncoder.encode(fileName, "UTF-8");
- fileName = fileName.replace("+", " "); // IE下载文件名空格变+号问题
- status = HttpStatus.OK;
- } else {
- fileName = new String(fileName.getBytes("UTF-8"), "ISO8859-1");
- }
- } catch(UnsupportedEncodingException e) {}
- HttpHeaders headers = new HttpHeaders();
- headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
- headers.setContentDispositionFormData("attachment", fileName);
- headers.setContentLength(body.length);
- return new ResponseEntity < byte[] > (body, headers, status);
- }
这里需要注意,一般来说下载文件是使用 201 状态码的,但是 IE 浏览器不支持,还得我花了很大力气才找出来是那个问题
其中对文件名的处理是为了防止中文以及空格导致文件名乱码
控制器方法
在控制器的那里需要对返回值进行处理
- @RequestMapping(value = "/download-backup", method = RequestMethod.GET)
- @ResponseBody
- public ResponseEntity<byte[]> downloadBackupFile(@RequestParam String fileName) {
- byte[] body = backupService.downloadFile(fileName);
- return downloadResponse(body, fileName);
- }
来源: http://www.phperz.com/article/17/0821/338954.html