http://www.cnblogs.com/yolanda-lee/p/4683422.html

文件的上传下载一般在项目中还是非常实用的,此处专门整理一下文件的下载,至于文件的上传实现将在后续中补上。文件的下载多用于模板文件的下载,这在项目中用的还是挺多的。今天用到了就整理出来了,以供搬运工们借鉴并使用,已验证无误。

(1)     前台实现

前台实现非常简单,不像文件上传那样复杂,只要给出一个超链接,链接到后台处理的方法,并且需要将文件名传入Controller。

(2)     后台处理

后台的Controller就主要处理这样几个问题:

①根据文件名,找到模板文件

②设置响应的形式、文件头、编码

③通过流的形式读取模板文件内容并将之写入输出流

④关闭输入输出流

(3)     下面我们根据前台后台的实现思路来具体看一下实现代码:

①前台:

<a href="${base}/downloadTemplate?fileName=abilityTemplate.xlsx">模板下载</a>

  ②后台:

@RequestMapping(value = "/downloadTemplate",method = RequestMethod.GET)

    public String downloadAbilityTemplate(String fileName,HttpServletRequest request,HttpServletResponse response){

        response.setCharacterEncoding("utf-8");//设置编码

        response.setContentType("multipart/form-data");//设置类型

        response.setHeader("Content-Disposition", "attachment;fileName="+ fileName);                                       //设置响应头

        try {

        String filePath = Config.getValue("path");

//获取配置文件中模板文件所在目录

        String path = request.getSession().getServletContext().getRealPath("/")+filePath;

//获取模板文件的相对目录

        InputStream inputStream = new FileInputStream(new File(path+ File.separator + fileName));

        OutputStream os = response.getOutputStream();

        byte[] b = new byte[2048];

        int length;

        while ((length = inputStream.read(b)) > 0) {

                os.write(b, 0, length);

        }//边读模板文件边写入输出流

        os.close();

        inputStream.close();//关流

        } catch (FileNotFoundException e) {

                e.printStackTrace();

        } catch (IOException e) {

                e.printStackTrace();

        }

        return null;                //注意此时return null

}

  

(4)     注意点:

①返回模型层应该是return null,否则出现如下错误:

java+getOutputStream() has already been called for this response

②模板文件的位置可以根据需要存放,只要在后台能获取到此文件的全路径就行

放在class目录下获取是:

//获取classes所在路径

String path = Thread.currentThread().getContextClassLoader().getResource("").getPath();

//获取WebRoot目录:

String path = request.getSession().getServletContext().getRealPath("/")

行走在设计师的路上!

关于SpingMVC实现文件下载你所不知道的的更多相关文章

  1. 你所不知道的setInterval

    在你所不知道的setTimeout记载了下setTimeout相关,此篇则整理了下setInterval:作为拥有广泛应用场景(定时器,轮播图,动画效果,自动滚动等等),而又充满各种不确定性的这set ...

  2. 你所不知道的setTimeout

    JavaScript提供定时执行代码的功能,叫做定时器(timer),主要由setTimeout()和setInterval()这两个函数来完成.它们向任务队列添加定时任务.初始接触它的人都觉得好简单 ...

  3. 你真的会玩SQL吗?你所不知道的 数据聚合

    你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...

  4. 你所不知道的linq(二)

    上一篇说了from in select的本质,具体参见你所不知道的linq.本篇说下from...in... from... in... select 首先上一段代码,猜猜结果是什么? class P ...

  5. 你所不知道的SQL Server数据库启动过程,以及启动不起来的各种问题的分析及解决技巧

    目前SQL Server数据库作为微软一款优秀的RDBMS,其本身启动的时候是很少出问题的,我们在平时用的时候,很少关注起启动过程,或者很少了解其底层运行过程,大部分的过程只关注其内部的表.存储过程. ...

  6. 你所不知道的SQL Server数据库启动过程(用户数据库加载过程的疑难杂症)

    前言 本篇主要是上一篇文章的补充篇,上一篇我们介绍了SQL Server服务启动过程所遇到的一些问题和解决方法,可点击查看,我们此篇主要介绍的是SQL Server启动过程中关于用户数据库加载的流程, ...

  7. Android中Context详解 ---- 你所不知道的Context

    转自:http://blog.csdn.net/qinjuning/article/details/7310620Android中Context详解 ---- 你所不知道的Context 大家好,  ...

  8. 你所不知道的html5与html中的那些事第三篇

    文章简介: 关于html5相信大家早已经耳熟能详,但是他真正的意义在具体的开发中会有什么作用呢?相对于html,他又有怎样的新的定义与新理念在里面呢?为什么一些专家认为html5完全完成后,所有的工作 ...

  9. 你所不知道的 URL

    0.说明 第一幕 产品:大叔有用户反映账户不能绑定公众号.大叔:啊咧咧?怎么可能,我看看?大叔:恩?这也没问题啊,魏虾米.大叔:还是没问题啊,挖叉类.大叔:T T,话说产品姐姐是不是Java提供接口的 ...

随机推荐

  1. WAF 与 RASP 的安装使用大比拼!

    什么是WAF和RASP? WAF全称是Web application firewall,即 Web 应用防火墙.RASP 全称是 Runtime Application Self-protect,即应 ...

  2. Python 标准库 urllib2 的使用细节

    刚好用到,这篇文章写得不错,转过来收藏.    转载自 道可道 | Python 标准库 urllib2 的使用细节 Python 标准库中有很多实用的工具类,但是在具体使用时,标准库文档上对使用细节 ...

  3. VMware与宿敌Amazon一笑泯恩仇:重新定义混合云?(私有云节节败退)

    摘要: 私有云巨头VMware看来是真的要输给一个“书贩子” 了!这意味着私有云将败给公有云? [阅读原文] 三年前,虚拟化巨头VMware曾对亚马逊Amazon云服务AWS竖过中指:我们怎么可能打不 ...

  4. VC 无标题栏对话框移动(在OnLButtonDown里再次发送消息)

    操作系统:Windows 7软件环境:Visual C++ 2008 SP1本次目的:实现无框移动 所谓的无标题栏对话框,是基于对话框的工程,对话框属性Border设置为None,对话框如下所示: 为 ...

  5. Android:DES加密

    private static final String KEY = "xxxxxx"; // KEY的字节长度必须超过24 public DESUtil(){ super(); } ...

  6. 如何使用GetManifestResourceStream

    在做开发时想要从程序集中加载一个xml文件数据,可是在运行后确取不到值,值始终是null. 代码如下: Stream ss = this.GetType().Assembly.GetManifestR ...

  7. scaleform 注意事项

    在使用 自带的UI .fla 里面的组建时 需要把自己建立的fla进行如下设置.  文件-发布设置-flash-脚本actionscript3.0设置——舞台:自动声明舞台实例    

  8. 利用if,else判断输入的是不是一个正整数

    static void Main(string[] args)        {            while (true)                      { Console.Writ ...

  9. Automator一键生成所需的iOS 图片icon

    iOS到8了, 终于受不了它的各种尺寸的icon了. 写一个Finder服务来一键生成吧. 拖放几次再重复, 无技术含量, 但很有用. // 存放目录    ~/资源库/Services/

  10. 【转】NI语法 JNI参考 JNI函数大全

    原文网址:http://blog.sina.com.cn/s/blog_5de73d0b0101chk1.html 一.对照表 Java类型    本地类型         描述boolean     ...