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. 如何用JavaScript在浏览器端获取图片的原始尺寸大小?

    var img = $("#img_id"); // Get my img elem var pic_real_width, pic_real_height; $("&l ...

  2. [cc150] 硬币问题

    Given an infinite number of quarters (25 cents), dimes (10 cents), nickels (5 cents) and pennies (1 ...

  3. Ollydbg 中断方法浅探

    Ollydbg是一个新的32位的汇编层调试软件.适应于windows98.me.2000.xp和2003操作系统.由于他具有图形窗口界面,所以操作方便.直观,是cracker的好工具. 由于Ollyd ...

  4. 什么是 DevSecOps?系列(一)

    什么是 DevSecOps? 「DevSecOps」 的作用和意义建立在「每个人都对安全负责」的理念之上,其目标是在不影响安全需求的情况下快速的执行安全决策,将决策传递至拥有最高级别环境信息的人员. ...

  5. 如何启动 SQL Server Agent(SQL Server 配置管理器)

    如何启动 SQL Server Agent(SQL Server 配置管理器) SQL Server 2008 R2 其他版本   4(共 6)对本文的评价是有帮助 - 评价此主题 可以从 SQL S ...

  6. Java:List,ArrayList和LinkList的区别

    1.大学数据结构中ArrayList是实现了基于动态数组的数据结构,LinkList基于链表的数据结构 2.对于随机访问get和set,ArrayList优于LinkList,因为LinkedList ...

  7. Android:DES加密

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

  8. 【HDOJ】1230 火星A+B

    个人觉得这道题没那么水,wa了几次,才发现自己居然没有给srcb数组reset,打错了.搞死啊. #include <stdio.h> #include <string.h> ...

  9. Sublime Text SFTP 注册码,亲测有效,SVN注册码

    SFTP { "email": "xiaosong@xiaosong.me", "product_key": "d419f6-de ...

  10. Web服务器排行:Nginx超越Apache 成为全球

    Apache(34.5%)第一名的位置.不过,纵观全球,Apache仍然是最受欢迎的Web服务器,有65.3%的网站使用. 在排名前100万的网站中,主流服务器仍为Apache,占据了60.6%的份额 ...