使用Apache的IOUtils实现文件下载

废话不多说,直接上代码,注释写得也比较清楚。

/**
     * 下载模板文件
     * @param filename 要下载的文件在工程中的路径,如/template/userTemplate.xls
     */
    @RequestMapping("/common/downloadtemplatefile")
    public void downloadTemplateFile(String filename, HttpServletResponse response,
                                     HttpServletRequest request) {
        LOGGER.info("【下载模板文件】filename : " + filename);
        if (StringUtils.isNotBlank(filename)) {
            LOGGER.warn("【模板文件路径为空】");
            throw new RuntimeException("模板文件路径为空");
        }
        // 截取后缀名
        int lastIndexOfPoint = filename.lastIndexOf(".");
        String suffix = filename.substring(lastIndexOfPoint);
        // 需要下载的文件
        String filepath = request.getSession().getServletContext().getRealPath(filename);
        File myfile = new File(filepath);
        // 清空response
        response.reset();
        // 设置response的Header
        response.addHeader("Content-Disposition", "attachment;filename=" + filename.getBytes()
                                                  + suffix);
        response.addHeader("Content-Length", "" + myfile.length());
        response.setContentType("application/octet-stream");

        OutputStream toClient = null;
        InputStream fis = null;
        //打开文件输入流 和 servlet输出流
        try {
            toClient = new BufferedOutputStream(response.getOutputStream());
            fis = new BufferedInputStream(new FileInputStream(myfile));
            //通过ioutil 对接输入输出流,实现文件下载
            IOUtils.copy(fis, toClient);
            toClient.flush();
        } catch (Exception e) {
            LOGGER.error("【文件下载失败】", e);
            throw new RuntimeException("文件下载失败");
        } finally {
            //关闭流
            IOUtils.closeQuietly(fis);
            IOUtils.closeQuietly(toClient);
        }

    }
时间: 2024-12-10 22:35:38

使用Apache的IOUtils实现文件下载的相关文章

Java Web文件下载

Web文件下载有两种,一种是文件在网站目录下,在浏览器中直接输入文件路径即可下载,如http://www.xxx.com/file.zip.另外一种是文件不在网站目录下或者文件是动态生成的(导出报表或者导出excel等),这种情况需要通过response的OutputStream实现文件的下载.DownloadUtils是一个Java Web文件下载工具类,提供多种静态方法实现文件下载. package com.rhui.util; import java.io.BufferedInputStr

Stack Overflow 上人气最旺的 10 个 Java 问题

1. 为什么两个(1927年)时间相减得到一个奇怪的结果? (3623个赞) 如果执行下面的程序,程序解析两个间隔1秒的日期字符串并比较: public static void main(String[] args) throws ParseException { SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String str3 = "1927-12-31 23:54:07"

Java 把 InputStream 转换成 String 的几种方法

我们在 Java 中经常会碰到如何把 InputStream 转换成 String 的情形,比如从文件或网络得到一个 InputStream,需要转换成字符串输出或赋给别的变量. 未真正关注这个问题之前我常用的办法就是按字节一次次读到缓冲区,或是建立 BufferedReader 逐行读取.其实大可不必费此周折,我们可以用 Apache commons IOUtils,或者是 JDK 1.5 后的 Scanner,还可用 Google  Guava 库的 CharStreams.到了 JDK7,

Java 里把 InputStream 转换成 String 的几种方法

我们在 Java 中经常会碰到如何把 InputStream 转换成 String 的情形,比如从文件或网络得到一个 InputStream,需要转换成字符串输出或赋给别的变量. 未真正关注这个问题之前我常用的办法就是按字节一次次读到缓冲区,或是建立 BufferedReader 逐行读取.其实大可不必费此周折,我们可以用 Apache commons IOUtils,或者是 JDK 1.5 后的 Scanner,还可用 Google  Guava 库的 CharStreams.到了 JDK7,

Stackoverflow上人气最旺的10个Java问题

1. 为什么两个(1927年)时间相减得到一个奇怪的结果? (3623个赞) 如果执行下面的程序,程序解析两个间隔1秒的日期字符串并比较: 1 2 3 4 5 6 7 8 9 10 public static void main(String[] args) throws ParseException {     SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");      String str3 = &

java 下载文件的样例

import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URLEncoder; import java

从菜鸟到大牛的码农升职必学文章推荐

几年前我也是一个码农菜鸟,我也常常幻想着成为技术大牛. 如何减小与"大牛"的差距是我常常不得不面对的话题.今天从我走过来的路来总结一下成为大牛的技术之路. 先来看一张程序员的时间管理图. 除了时间管理,技术学习也是少不了的.下面推荐一下比较好的技术文章. 使用瀑布流插件 Masonry 进行瀑布流布局 业余草微信公众号上线了! 使用HTML5 Canvas实现火焰风暴动画 HTML5 实现3D翻转立方体 使用 HTML5 制作像素太空战机游戏 常用的Linux关机命令大全 5个常用的L

【Stackoverflow好问题】将InputStream转换为String

不重复造轮子.最靠谱的方法,还是用Apache commons IOUtils 这样简单几行代码就搞定了 StringWriter writer = new StringWriter(); IOUtils.copy(inputStream, writer, encoding); String theString = writer.toString(); 或者 String theString = IOUtils.toString(inputStream, encoding) 如果不想引入Apac

Java EE----Action的处理结果配置

1.Action返回字符串(逻辑视图名称) <action> 元素中查找 逻辑视图名 对应 局部<result> 如果局部<result>不存在, 会查找全局<result> (每个package里都可以定义一些全局 <global-result>) * 如果局部<result> 和全局 <global-result> 都没有找到 No result defined for xxx 2.配置<result> 每