下载文件(前端+后台)

1,页面

<a href="javascript:void(0)" class="btn buttonBox btn-primary " onclick="downloadExampleDataTemplate()" style="background-color: #1ab394;border-color: #1ab394;height: 32px;">下载样例模版</a>

2,js

//下载样例模板
function downloadExampleDataTemplate() {
    var id = $("#id").val();
    window.location.href="downloadExampleDataTemplate?id="+id;
}

3,后台

/**
     * 下载文件
     * @param response
     * @param fileName 文件名称
     * @author 
     * @date 2018/3/31
     */
    public static void downFile(HttpServletResponse response, String fileName, String templateUrl) {
        String filePath = templateUrl+fileName+".xls";

        //读取要下载的文件,保存到文件输入流
        try {
            // 设置头部信息
            response.setHeader(
                    "Content-disposition",
                    "attachment;filename="
                            + URLEncoder.encode(fileName+".xls", "UTF-8"));
            FileInputStream in = new FileInputStream(filePath);
            //创建输出流
            OutputStream out = response.getOutputStream();
            //创建缓冲区
            byte buffer[] = new byte[1024];
            int len = 0;
            //循环将输入流中的内容读取到缓冲区当中
            while((len=in.read(buffer))>0){
                //输出缓冲区的内容到浏览器,实现文件下载
                out.write(buffer, 0, len);
            }
            //关闭文件输入流
            in.close();
            //关闭输出流
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

4,出现问题

(1)一开始用的ajax发送的请求

$.ajax({
                url:"downFile",
                type:'post',
                async:true,
                data:$("#queryCourseForm").serialize(),//携带查询条件
                success:function () {
                   
                }
            });

但是响应头正确,数据也正确的传到后台,但是未下载文件

 

总结(参考:https://www.cnblogs.com/qlqwjy/p/8971207.html):

即使ajax请求到一个controller在跳转到下载的controller上也不能下载,百度了一下总结下原因:发现原来jQuery的ajax回调已经把response的数据傻瓜式的以字符串的方式解析.

 5,解决办法

参考:https://www.cnblogs.com/qlqwjy/p/8971207.html

  • 第一种:将传条件的以表单提交的方式进行(推荐这种)-----这种方式也可以用来页面跳转
    $("#queryCourseForm").attr("action",contextPath+"/downCourses.do");//改变表单的提交地址为下载的地址
                $("#queryCourseForm").submit();//提交表单
  • 第二种:以window.location.href="xxx"的方式请求下载地址(我用的这一种)
    window.location.href=contextPath+"/downCourses.do"

     

posted @ 2019-01-04 17:05  無玑小姐  阅读(1809)  评论(0编辑  收藏  举报