说明:Ajax是无法实现文件传输的,本文只是模拟了Ajax不刷新页面就可以请求并返回数据的效果。实质上还是通过提交form表单来返回文件流的输出。

分步实现逻辑:

  1. ajax请求服务器,访问数据库,根据查询到的数据生成一个数据文件,返回前台一个json对象(可放置生成成功标记,文件路径等信息)。
  2. ajax success回调函数部分,根据返回的json对象,调用手写的js下载文件的方法,实现页面无刷新下载文件。

贴上部分代码供参考:

js代码:

1. js写一个动态创建并提交form表单的方法,依赖于jQuery插件。

// 文件下载
jQuery.download = function(url, method, filedir, filename){
jQuery('<form action="'+url+'" method="'+(method||'post')+'">' + // action请求路径及推送方法
'<input type="text" name="filedir" value="'+filedir+'"/>' + // 文件路径
'<input type="text" name="filename" value="'+filename+'"/>' + // 文件名称
'</form>')
.appendTo('body').submit().remove();
};

2. 查询数据,输出到文件,保存到服务器,并调用download方法实现下载

// 查询数据,输出到文件,保存到服务器,并实现下载
function exportOilDetection() {
var ids = ['1','2','3','4']; // 查询参数代表(可根据实际情况修改),需要导出数据的id
$.ajax({
type : 'POST',
dataType : 'json',
async : false,
url : "${pageContext.request.contextPath}/oilDetectionAction!ajaxExportOilDetectionInfos.action", // 生成文件,保存在服务器
data : {
ids : ids,
},
success : function(data) {
var result = data["data"];
if (result[0] == "success") {
// result[0] -- 文件生成成功标记
// result[1] -- 路径
// result[2] -- 文件名称
$.download('oilDetectionAction!ajaxDownloadDataExcel.action', 'post', result[1], result[2]); // 下载文件
} else {
alert("数据导出失败!");
}
},
error : function(XMLHttpRequest, textStatus, e) {
console.log("oilDetection.js method exportOilDetection" + e);
}
});
}

action文件配置

  • ajax生成文件后,会返回json类型结果
        <action name="oilDetectionAction" class="oilDetectionAction">
<result name="ajax" type="json">
<param name="root">result</param>
</result>
<result name="success">/page/oilDetection.jsp</result>
</action>

java代码:

  • 返回文件流需借助response对象,所以action类需要实现ServletResponseAware接口,并声明response对象自动注入
public class OilDetectionAction implements ServletResponseAware {

    HttpServletResponse response;

    /**
* 自动注入response
*/
public void setServletResponse(HttpServletResponse response) {
this.response = response;
} ....
}
  • 下载文件部分代码:
public class OilDetectionAction implements ServletResponseAware {

     ....

    /**
* 将生成的文件网络传输到客户端
*/
public void ajaxDownloadDataExcel() throws IOException {
InputStream ins = null;
BufferedInputStream bins = null;
OutputStream outs = null;
BufferedOutputStream bouts = null;
String file_name = getRequest().getParameter("file_name").trim(); // 文件名
String file_dir = getRequest().getParameter("file_dir").trim(); // 文件路径
System.out.println("获取到文件路径:" + file_dir + File.separator + file_name);
try {
if (!"".equals(file_name)) {
File file = new File(file_dir + File.separator + file_name);
if (file.exists()) {
ins = new FileInputStream(file_dir + File.separator
+ file_name);
bins = new BufferedInputStream(ins);
outs = response.getOutputStream();
bouts = new BufferedOutputStream(outs);
response.setContentType("application/x-download");
response.setHeader(
"Content-disposition",
"attachment;filename="
+ URLEncoder.encode(file_name, "UTF-8"));
int bytesRead = 0;
byte[] buffer = new byte[8192];
while ((bytesRead = bins.read(buffer, 0, 8192)) != -1) {
bouts.write(buffer, 0, bytesRead);
}
bouts.flush();
} else {
throw new Exception("下载的文件不存在!");
}
} else {
throw new Exception("导出文件时发生错误!");
}
} catch (Exception e) {
log.error(e.getMessage(), e);
} finally {
if (null != ins) {
ins.close();
}
if (null != bins) {
bins.close();
}
if (null != outs) {
outs.close();
}
if (null != bouts) {
bouts.close();
}
}
}
}

Ajax下载文件(页面无刷新)的更多相关文章

  1. Ajax技术实现页面无刷新跳转

    Ajax实现无刷新显示新的页面 <!DOCTYPE html> <html> <head> <script src="/jquery/jquery- ...

  2. 浅谈页面无刷新技术ajax

    现在一般网站都是用ajax来实现页面无刷新操作的. 什么是无刷新:ajax可以实现页面与后台的数据交互,用户完全感觉不出页面有任何的刷新,这就是AJAX的无刷新. ajax方法实现: 可以对ajax进 ...

  3. 基于jQuery的ajax系列之用FormData实现页面无刷新上传

    接着上一篇ajax系列之用jQuery的ajax方法向服务器发出get和post请求写,这篇主要写如何利用ajax和FormData实现页面无刷新的文件上传效果,主要用到了jQuery的ajax()方 ...

  4. HTTP与AJAX深入揭秘,不使用AJAX实现页面无刷新

    AJAX的原理是什么? 实际上就是发起HTTP请求,既然就是发起HTTP请求,那只要我们能够实现发起HTTP请求就可以在不使用AJAX的情况下实现相同的效果. 在前端有好多方式可以发起HTTP请求,比 ...

  5. 使用ajax和history.pushState无刷新改变页面URL onpopstate(转)

    Javascript代码 var htmlData1 = $.ajax(    {    url: "/getXXXResponse",    async: false }).re ...

  6. JQuery 实现页面无刷新

    对于JQuery实现页面无刷新的效果,即:应用这个JQuery这个组件,可以实现在页面上加载数据库中的数据信息,但是并没有给用户页面刷新的感觉,这样既可以有效的进行数据交互,也可以不妨碍用户的其他操作 ...

  7. ajax 下载文件

    原本现在文件直接通过超链接可以完成下载,但现在要在url中附带几个参数,并且这些参数要是点击事件触发时的最新值,所以这里使用ajax的方式进行下载 然而: 1.使用ajax,ajax的返回值类型是js ...

  8. 页面无刷新Upload File

    页面无刷新Upload File. 利用jquery.form.js的ajaxForm提交文件. 具体参考以下代码: 前台html <%@ Page Language="C#" ...

  9. ajax+FormData+javascript实现无刷新表单信息提交

    ajax+FormData+javascript实现无刷新表单信息提交 原理: dom收集表单信息,利用FormData快速收集表单信息  ,实例化表单数据对象 同时收集fm的表单域信息. var f ...

随机推荐

  1. 异步套接字基础:select函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET

    参考:[原创]技术系列之 网络模型(三)多路复用模型 select函数 select函数: 系统提供select函数来实现多路复用输入/输出模型.原型: #include <sys/time.h ...

  2. Spark函数详解系列之RDD基本转换

    摘要:   RDD:弹性分布式数据集,是一种特殊集合 ‚ 支持多种来源 ‚ 有容错机制 ‚ 可以被缓存 ‚ 支持并行操作,一个RDD代表一个分区里的数据集   RDD有两种操作算子:         ...

  3. 用Less循环生成样式

    需求是这样的,我要给一个轮播图设置不同的背景图,由于每张图片的背景图路劲都不一样,所以需要对每个单独的元素自定义图片路径.然后想到Less语法有mixin机制,就这样实现了一个递归function,然 ...

  4. 【软件技巧】Sublime Text为不同语法定义不同高亮

    Sublime Text默认的语法高亮已经非常美丽了,可是对于个别语言还是有些不爽. 默认高亮规则叫Monokai,能够从Preferences->Settings - Default中看到: ...

  5. LDA-线性判别分析(一)

    本来是要调研 Latent Dirichlet Allocation 的那个 LDA 的, 没想到查到很多关于 Linear Discriminant Analysis 这个 LDA 的资料.初步看了 ...

  6. Error creating bean with name &#39;memcachedClient&#39;...java.lang.OutOfMemoryError

    1,Tomcat启动报错例如以下: Caused by: org.springframework.beans.factory.BeanCreationException: Error creating ...

  7. java final 和instanceof 关键字

    /* final class A { public final void eat(){ System.out.println("测试"); } } */ class A { } c ...

  8. Android的ADB工具使用

    在SDK的Tools文件夹下包含着Android模拟器操作的重要命令ADB,ADB的全称为Android Debug Bridge,就是调试桥的作用,借助这个工具,我们可以管理设备或手机模拟器的状态  ...

  9. MVC 界面开发

    1.什么是设计模式 mvc只是其中一种,对某一类具体问题,总结出来的一套最优的解决方案 1.MVC: 1.Model(模型)     View(视图)    Controller(控制器) 的缩写 M ...

  10. CSS 设计彻底研究(一)(X)HTML与CSS核心基础

    第1章 (X)HTML与CSS核心基础 这一章重点介绍了4个方面的问题.先介绍了 HTML和XHTML的发展历程以及需要注意的问题,然后介绍了如何将CSS引入HTML,接着讲解了CSS的各种选择器,及 ...