ajax实现文档导出及下载
问题说明:Ajax是无法实现文件传输的,本文只是模拟了Ajax不刷新页面就可以请求并返回数据的效果。实质上还是通过提交form表单来返回文件流的输出。
分步实现逻辑:
- ajax请求服务器,访问数据库,根据查询到的数据生成一个数据文件,返回前台一个json对象(可放置生成成功标记,文件路径等信息)。
- 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方法实现下载
  //ajax交互导出文档并获取文档路径及预下载文件名,返回格式{\"result\":\"success\",\"filePath\":\"\",\"fileName\":\"\"}
        function DownFilesAjax(url, prams, downurl) {
            showLoading(true);//调用加载动画http://spin.js.org/
            $.ajax({
                type: 'POST',
                dataType: 'json',
                async: false,
                url: url,// 生成文件,保存在服务器
                data: prams,
                success: function (data) {
                    if (data.result == "success") {
                        $.download(downurl, 'post', data.filePath, data.fileName); // 下载文件
                       showLoading(false);//隐藏加载动画http://spin.js.org/
                    } else {
                        alert("数据导出失败!");
                        showLoading(false);
                    }
                },
                error: function (XMLHttpRequest, textStatus, e) {
                    //console.log("oilDetection.js  method exportOilDetection" + e);
                    alert("数据传输发生错误,请联系管理员!");
                    showLoading(false);
                }
            });
        }
附上spin加载动画调用js及其容器的遮罩样式。
调用js:
 var opts = {
            lines: , // 花瓣数目
            length: , // 花瓣长度
            width: , // 花瓣宽度
            radius: , // 花瓣距中心半径
            corners: , // 花瓣圆滑度 (0-1)
            rotate: , // 花瓣旋转角度
            direction: , // 花瓣旋转方向 1: 顺时针, -1: 逆时针
            color: '#fff', // 花瓣颜色
            speed: , // 花瓣旋转速度
            trail: , // 花瓣旋转时的拖影(百分比)
            shadow: false, // 花瓣是否显示阴影
            hwaccel: false, //spinner 是否启用硬件加速及高速旋转
            className: 'spinner', // spinner css 样式名称 easyui里用这个类样式,若引用了easyui.css务必换个类名,其他前端框架未知
            zIndex: 2e9, // spinner的z轴 (默认是2000000000)
            top: '50%', // spinner 相对父容器Top定位 单位 px
            left: '50%'// spinner 相对父容器Left定位 单位 px
        };
        var spinner = new Spinner(opts);
        //显示与隐藏加载动画
        function showLoading(result) {
            var spinContainer = document.getElementById("foo");
            if (result) {
           var target = $(spinContainer).get();
            spinner.spin(target);
            spinContainer.style.height = document.documentElement.clientHeight + "px";
           $(spinContainer).show();
            } else {
            spinner.spin();
           $(spinContainer).hide();
         }
        }
遮罩样式:
 #foo {
            position: fixed;
            left: ;
            top: ;
            _position: absolute;
            width: %;
            background: #;
            opacity: 0.5;
            filter: alpha(opacity=);
            z-index: ;
        display:none;
        }
以下一般处理程序中的相关代码。
导出文档:
public void ExportALLNianDuGongZuo(HttpContext context)
{
string result = string.Empty;
string Name = DateTime.Now.Year + "导出的文件" + ".xls";//下载文档名
try
{
#region 导出过程
DataTable dt = new DataTable();
DataColumn dc = null;
dc = dt.Columns.Add("序号", Type.GetType("System.Int32"));
dc.AutoIncrement = true;//自动增加
dc.AutoIncrementSeed = ;//起始为1
dc.AutoIncrementStep = ;//步长为1
dc.AllowDBNull = false;//
dc = dt.Columns.Add("col1", Type.GetType("System.String"));
dc = dt.Columns.Add("col2", Type.GetType("System.String"));
dc = dt.Columns.Add("col3", Type.GetType("System.String"));
dc = dt.Columns.Add("col4", Type.GetType("System.String"));
dc = dt.Columns.Add("col5", Type.GetType("System.String")); IList<object> list = object.FindAll(@"IsEnable=1", "GOrder, PaiXu", null, , );//数据列表
foreach (var item in list)
{
DataRow newRow;
newRow = dt.NewRow();
newRow["col1"] = item.Name;
newRow["col2"] = item.Ext3;
newRow["col3"] = item.XieZuoDeptName;
newRow["col4"] = item.Ext2;
newRow["col5"] = IsShangHui.Trim();
dt.Rows.Add(newRow);
}
MemoryStream ms = new MemoryStream();
string Path = context.Server.MapPath("~/UploadFile/" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".xls");//文件保存地址
string templatePath = context.Server.MapPath("~/UploadFile/模版.xls");//所用模版地址
ms = NPOIExcelHelper.DataTableToExcel(dt, templatePath, );//详见NPOI导出execl
using (FileStream fs = new FileStream(Path, FileMode.Create, FileAccess.Write))
{
byte[] data = ms.ToArray();
fs.Write(data, , data.Length);
fs.Flush();
}
#endregion
result = "{\"result\":\"success\",\"filePath\":\"" + ReplaceString(Path) + "\",\"fileName\":\"" + Name + "\"}";
}
catch (Exception ex)
{
result = "{\"result\":\"fail\"}";
Unionstars.Trace.Log.WriteLine("导出发生错误:【" + ex + "】");
}
context.Response.ContentType = "application/Json";
context.Response.Write(result);
context.Response.End();
}
ajax无法传输文件,另新建web页面用来下载即可。
下载文档页面后台代码(前台删得只剩第一句即可):
protected void Page_Load(object sender, EventArgs e)
{
string fileName = Request["filename"];//下载文档名
string filePath = Request["filedir"];
FileInfo fileInfo = new FileInfo(filePath);
Response.Clear();
Response.ClearContent();
Response.ClearHeaders();
String userAgent = System.Web.HttpContext.Current.Request.UserAgent;
//判断是否为ie10以下及ie11浏览器
if (userAgent.Contains("MSIE") || userAgent.Contains("rv:11"))
{
fileName = System.Web.HttpUtility.UrlEncode(fileName);
}
Response.AddHeader("Content-Disposition", string.Format("attachment;filename=\"{0}\"", fileName));
Response.AddHeader("Content-Length", fileInfo.Length.ToString());
Response.AddHeader("Content-Transfer-Encoding", "binary");
Response.ContentType = "application/octet-stream";
Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312");
Response.WriteFile(fileInfo.FullName);
Response.Flush();
Response.End();
}
终极方法,哈哈哈,留到最后
    function download(url, downLoadFileRename) {
        var xhr = new XMLHttpRequest();
        xhr.open('GET', url, true);        // 也可以使用POST方式,根据接口
        xhr.responseType = "blob";    // 返回类型blob
        // 定义请求完成的处理函数,请求前也可以增加加载框/禁用下载按钮逻辑
        xhr.onload = function () {
            // 请求完成
            if (this.status === ) {
                // 返回200
                var blob = this.response;
                var reader = new FileReader();
                reader.readAsDataURL(blob);    // 转换为base64,可以直接放入a表情href
                reader.onload = function (e) {
                    // 转换完成,创建一个a标签用于下载
                    var a = document.createElement('a');
                    a.download = downLoadFileRename;
                    a.href = e.target.result;
                    $("body").append(a);    // 修复firefox中无法触发click
                    a.click();
                    $(a).remove();
                }
            }
        };
        // 发送ajax请求
        xhr.send()
    }
ajax实现文档导出及下载的更多相关文章
- 懒得写文档,swagger文档导出来不香吗
		导航 前言 离线文档 1 保存为html 2 导出成pdf文档 3 导出成Word文档 参考 前言 早前笔者曾经写过一篇文章<研发团队,请管好你的API文档>.团队协作中,开发文档的重 ... 
- 【资源】108个大数据文档PDF开放下载-整理后打包下载
		本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4288836.html 本博客其他.NET开源项目文章目录:h ... 
- NVelocity介绍,NVelocity中文手册文档及实例下载
		NVelocity是什么velocity英音:[vi'lɔsiti]美音:[və'lɑsətɪ]近在做一个项目,客户要求有网站模板功能,能够自主编辑网站的风格,因为这个系统是为政府部门做子站系统,举个 ... 
- 将Swagger2文档导出为HTML或markdown等格式离线阅读
		网上有很多<使用swagger2构建API文档>的文章,该文档是一个在线文档,需要使用HTTP访问.但是在我们日常使用swagger接口文档的时候,有的时候需要接口文档离线访问,如将文档导 ... 
- word 文档导出 (freemaker+jacob)--java开发
		工作中终于遇到了 需要导出word文旦的需求了.由于以前没有操作过,所以就先百度下了,基本上是:博客园,简书,CDSN,这几大机构的相关帖子比较多,然后花了2周时间 才初步弄懂. 学习顺序: 第一阶 ... 
- vs2012 MSDN帮助文档离线包下载安装方法
		vs2012安装文件 自带的 MSDN帮助文档不全, 需要自己手动添加需要的离线文档包, 具体方法如下 1. 打开 vs2012 2. 按 ctrl + alt + F1 打开帮助文档管理器 3. 在 ... 
- 上传文件到 Sharepoint 的文档库中和下载 Sharepoint 的文档库的文件到客户端
		文件操作应用场景: 如果你的.NET项目是运行在SharePoint服务器上的,你可以直接使用SharePoint服务器端对象模型,用SPFileCollection.Add方法 http://msd ... 
- 手写OOXML文档——导出xlsx格式表格文档
		一.准备工作: 2个js库,另外把样式文件抽离出来 require('file-saver'); import JSZip from 'jszip' import {stylesData,theme1 ... 
- Mysql、Oracle、SQLServer等数据库参考文档免费分享下载
		场景 MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统 ... 
随机推荐
- canvas画布如何画图案例
			<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ... 
- Linux---设备文件名和挂载点
			分区: 1.分区: MBR GPT 2.格式化 : 为了写入文件系统 3.设备文件名 4.什么是挂载点? 挂载点:使用已经存在的空目录作为挂载点 挂载: 必须分区: / (根分区) swap分区 ... 
- Android端高性能图像分类解决方案
			由于公司业务需要,前段时间开始了解AI方面的东西,准备找一个在android端性能较高的前向计算框架,了解了tflite,百度的mdl和腾讯的ncnn,最终敲定ncnn,不失所望,效果很不错,基本达到 ... 
- Linux如何挂载U盘
			1,以root用户登陆 先加载USB模块 modprobe usb-storage 用fdisk -l 看看U盘的设备 假如U盘是sda1 2,确定在 目录 /mnt 下建立了 文件夹 / ... 
- AlphaGo原理浅析
			一.PolicyNetwork(走棋网络) 首先来讲一下走棋网络.我们都知道,围棋的棋盘上有19条纵横交错的线总共构成361个交叉点,状态空间非常大,是不可能用暴力穷举的方式来模拟下棋的.但是我们可以 ... 
- java 幂等性(转)
			(转自)http://www.cnblogs.com/weidagang2046/archive/2011/06/04/idempotence.html 理解HTTP幂等性 基于HTTP协议的Web ... 
- [译]使用explain API摆脱ElasticSearch集群RED苦恼(转)
			"哔...哔...哗",PagerDuty的报警通知又来了. 可能是因为你又遭遇了节点宕机, 或者服务器机架不可用, 或者整个ElasticSearch集群重启了. 不管哪种情况, ... 
- 如何从本地远程访问虚拟机内的Mysql服务器?
			假设重装了操作系统,则本地的很多软件可能都需要重新安装,比如数据库.但是,假设我们把一些重要的软件安装在虚拟机当中,则在重装操作系统之前,数据库服务器可以和虚拟机一起进行备份.重装操作系统之后,原先的 ... 
- Office Web addin 踩坑计:替换后台网站为MVC框架时遇到的问题
			Office Web Addin 模板程序的后台本质上是一个网站,你在调试的时候可以发现它的进程是一个32位的IE进程 所以可以把它替换成Asp.net的网站. 替换方法: 1.点击WordRevie ... 
- 我的C#跨平台之旅(一):从 Hello World 开始
			创建一个“控制台应用程序”,目标框架为“.NET Framework 4.5”,并移除无关的文件及引用,仅保留对 “system.dll”的引用:其中工程文件中核心内容如下: 使用NuGet添加如下引 ... 
