如何利用Ajax下载文件

本文介绍了如何在Java Web环境中利用Ajax技术下载文件。由于Ajax默认不支持文件流下载,因此通过创建隐藏的HTML表单并模拟提交来实现异步文件下载。在服务器端,通过获取文件名,设置MIME类型和Content-Disposition头来完成文件的发送。在客户端,使用JavaScript函数DownLoad触发表单提交,从而避免页面刷新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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:
  1.         //获得请求文件名  
  2.         String filename = request.getParameter("filename");  
  3.         System.out.println(filename);  
  4.           
  5.         //设置文件MIME类型  
  6.         response.setContentType(getServletContext().getMimeType(filename));  
  7.         //设置Content-Disposition  
  8.         response.setHeader("Content-Disposition""attachment;filename="+filename);  
  9.         //读取目标文件,通过response将目标文件写到客户端  
  10.         //获取目标文件的绝对路径  
  11.         String fullFileName = getServletContext().getRealPath("/download/" + filename);  
  12.         //System.out.println(fullFileName);  
  13.         //读取文件  
  14.         InputStream in = new FileInputStream(fullFileName);  
  15.         OutputStream out = response.getOutputStream();  
  16.           
  17.         //写文件  
  18.         int b;  
  19.         while((b=in.read())!= -1)  
  20.         {  
  21.             out.write(b);  
  22.         }  
  23.           
  24.         in.close();  
  25.         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事件即可;
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值