springmvc之下载文件
2016-06-02 14:48
429 查看
springMVC 下载文件
在开发web项目时,我们经常会遇到下载文件的情况。我们下来看下面这个代码:public void downLoad(HttpServletResponse response, String filename) { if (file == null || !file.exists()) { return; } OutputStream out = null; try { response.reset(); response.setContentType("application/octet-stream; charset=utf-8"); response.setHeader("Content-Disposition", "attachment; filename=" + file.getName()); out = response.getOutputStream(); File file = new File(savePath + fileName);//文件路径 out.write(FileUtils.readFileToByteArray(file)); out.flush(); } catch (IOException e) { e.printStackTrace(); } finally { if (out != null) { try { out.close(); } catch (IOException e) { e.printStackTrace(); } } } }
在之前的servlet中这样的写法非常普遍,但是既然我们使用springmvc框架,不应该在暴露HttpServletResponse 这种j2ee的接口了,所以spring提供了更好、更优雅的实现方式。
@RequestMapping("/download") public ResponseEntity<byte[]> download(String fileName) throws IOException { HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); headers.setContentDispositionFormData("attachment", URLEncoder.encode(fileName,"UTF-8")); return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(mailService.getDownloadFile(fileName)), headers, HttpStatus.CREATED); }
我们详细看看这几行代码:
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
在源码中:
/** * Public constant media type for {@code application/octet-stream}. * */ public final static MediaType APPLICATION_OCTET_STREAM; /** * A String equivalent of {@link MediaType#APPLICATION_OCTET_STREAM}. */ public final static String APPLICATION_OCTET_STREAM_VALUE = "application/octet-stream"; APPLICATION_OCTET_STREAM = MediaType.valueOf(APPLICATION_OCTET_STREAM_VALUE);
这一句的作用相当于
response.setContentType("application/octet-stream; charset=utf-8");
指定contentType为”application/octet-stream”,contentType的作用就是用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件。这里的作用就是,告诉浏览器返回的是二进制流数据。
headers.setContentDispositionFormData("attachment", URLEncoder.encode(fileName,"UTF-8"));
Content-disposition其实可以控制用户请求所得的内容存为一个文件的时候提供一个默认的文件名,文件直接在浏览器上显示或者在访问时弹出文件下载对话框。 如attachment为以附件方式下载 。相当于servlet中:
response.setHeader("Content-Disposition", "attachment; filename=" + file.getName());
filename就是显示的下载框中默认的下载文件名。Content-Disposition参数本来是为了在客户端另存文件时提供一个建议的文件名,但是考虑到安全的原因,就从规范中去掉了这个参数。但是由于很多浏览器已经能够支持这个参数,所以只是在规范文档中列出,但是要注意这个不是HTTP/1.1的标准参数。为了让建议的文件名支持中文,使用了URLEncoder.encode(fileName,”UTF-8”)。
最后一句代码:
return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(mailService.getDownloadFile(fileName)), headers, HttpStatus.CREATED);
这里getDownloadFile()方法就是通过文件名得到文件,在使用这段代码时需要换成自己的实现方式。headers上面已经介绍过了,就是告诉浏览器返回的是二进制流数据(application/octet-stream),以附件的形式打开(”attachment;filename=xxx”)。并且返回状态码HttpStatus.CREATED(201,代表已创建请求成功并且服务器创建了新的资源。)
最后提醒注意的是,导包的时候不要导错了:
import org.apache.commons.io.FileUtils; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity;
相关文章推荐
- java-WEB中的监听器Lisener
- GUI - Web前端开发框架
- Extjs4.0 最新最全视频教程
- MyEclipse Web Project转Eclipse Dynamic Web Project
- axis备忘
- 创业如何选择WEB开发语言
- 端口详解(3)-源端口
- Erlang实现的一个Web服务器代码实例
- 防止网页脚本病毒执行的方法-from web
- 华为交换机的后缀详解
- DLL(Dynamic Linkable Library) 详解说明
- 自学成才的秘密:115个 web Develop 资源
- 使用批处理修改web打印设置笔记 适用于IE
- Apache Web让JSP“动”起来
- rudy 重载方法 详解
- web下载的ActiveX控件自动更新
- 推荐六款WEB上传组件性能测试与比较第1/10页
- 关于三种主流WEB架构的思考
- 使用 Iisext.vbs 列出 Web 服务扩展文件的方法
- 使用 Iisext.vbs 删除 Web 服务扩展文件的方法