您的位置:首页 > 编程语言 > Java开发

如何利用Ajax下载文件

2017-07-02 10:33 288 查看
Ajax下载无弹出框——原因:Ajax只能返回String类型的数据

一、当前做法:

利用ajax普通的异步请求下载的Controller,传送参数;

$.ajax({
type: 'POST',
url: "downloadReports.do",
data: [
{ name: "fileIds", value: "135" }
]

})


采用Response.write()的方法来下载文件,设置好如下的格式,

response.setContentType(
"application/octet-stream"
);


            
response.setContentType(
"application/OCTET-STREAM;charset=UTF-8"
);


            
response.setHeader(
"Content-Disposition"
"attachment;filename="
 
+ fileName1);


然后将数据流写入Response:



        //获得请求文件名  
        String filename = request.getParameter("filename");  
        System.out.println(filename);  
          
        //设置文件MIME类型  
        response.setContentType(getServletContext().getMimeType(filename));  
        //设置Content-Disposition  
        response.setHeader("Content-Disposition", "attachment;filename="+filename);  
        //读取目标文件,通过response将目标文件写到客户端  
        //获取目标文件的绝对路径  
        String fullFileName = getServletContext().getRealPath("/download/" + filename);  
        //System.out.println(fullFileName);  
        //读取文件  
        InputStream in = new FileInputStream(fullFileName);  
        OutputStream out = response.getOutputStream();  
          
        //写文件  
        int b;  
        while((b=in.read())!= -1)  
        {  
            out.write(b);  
        }  
          
        in.close();  
        out.close();  
但是结果是,没有弹出下载框,前段没有任何反应,通过查看ajax的返回数据,发现数据流发送到客户端。

二、原因分析:
Ajax异步请求的原因,需要改造ajax的下载请求,

JQuery的ajax函数的返回类型只有xml、text、json、html等类型,没有“流”类型,所以我们要实现ajax下载,不能够使用相应的ajax函数进行文件下载。但可以用js生成一个form,用这个form提交参数,并返回“流”类型的数据。在实现过程中,页面也没有进行刷新。

<script type="text/JavaScript">

        function DownLoad(strUrl) { 

            var form = $("<form>");   //定义一个form表单

            form.attr('style', 'display:none');   //在form表单中添加查询参数

            form.attr('target', '');

            form.attr('method', 'post');

            form.attr('action', "/QuestionInfo/DowmLoad");

            var input1 = $('<input>');

            input1.attr('type', 'hidden');

            input1.attr('name', 'strUrl');

            input1.attr('value', strUrl);

            $('body').append(form);  //将表单放置在web中 

            form.append(input1);   //将查询参数控件提交到表单上

            form.submit();

         }

    </script>

————以上代码直接实现为某个按钮的Click事件即可;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ajax java web 异步