zoukankan      html  css  js  c++  java
  • 关于SpingMVC实现文件下载你所不知道的

    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("/")

    行走在设计师的路上!
  • 相关阅读:
    小白自动化测试指南
    分布式性能测试框架用例方案设想(二)
    高QPS下的固定QPS模型
    测试自动化最佳实践【译】
    moco框架接口命中率统计实践
    基于docker的分布式性能测试框架功能验证(一)
    编写高质量代码:Web前端开发修炼之道(一)
    JavaScript中点操作符和中括号操作符区别
    Vue脚手架生成及配置
    Npm设置淘宝镜像
  • 原文地址:https://www.cnblogs.com/a757956132/p/4703761.html
Copyright © 2011-2022 走看看