数据表格,查询、导出共用一个form表单,实现文件流方式下载
在开发中遇到问题是这样的:
在维护老的管理系统的过程中,老板说让加导出功能;项目中,查询的筛选条件是用的表单提交的方式写的。
解决方案有两种:
一、用ajax方式导出
var array = $('#frmSearch').serialize();
获得表单数据后,用post方式提交给服务器,服务器返回文件所存在的网络地址,然后用windows.open()的方式下载文件
但是我希望文件下载后,能够把文件删除了;用上边方式就不太合适了,不能及时删除旧文件,于是想出下面的方式:
二、文件流的方式下载
由于ajax不能处理文件流,所以不能再用ajax方式提交数据了,只能还用form表单方式提交数据,但问题来了,怎么能让一个form表单实现两个功能呢?
解决方式就是,我们在js中模拟出一个form表单即可,代码如下:
var $frm = $('<form action="" method="post"></form>');
var array = $('#frmSearch').serializeArray();
for (i = 0, length = array.length; i < length; i++) {
key = array[i].name;
value = array[i].value;
$frm.append($('<input name = "' + key + '" value = "' + value + '" />'));
}
$frm.submit();
服务器端处理流程是这样的:①根据筛选条件查询数据,然后生成excel;②把文件转换成文件流;③删除该文件;④设置响应头,输出文件流数据;
简单示例代码如下:
//①根据筛选条件查询数据,然后生成excel
List<TradeViewModel> modelList = ...;string fileName;
string path = ExportHelper.ExportDataToExcel(modelList, "TradeModel.xlsx", "收支记录导出列表",
new[] { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K" },
new[] { "Id", "Subject", "Payer", "Receiver", "Manager", "Recorder", "Amount", "PayWay", "PayDate", "Receipt", "Status" },
out fileName);
//②把文件转换成文件流
byte[] bytes;
using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Read))
{
bytes = new byte[(int)fs.Length];
fs.Read(bytes, , bytes.Length);
}
//③删除该文件
System.IO.File.Delete(path);
//④设置响应头,输出文件流数据
Response.ContentType = "application/octet-stream";
//通知浏览器下载文件而不是打开
Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8));
Response.BinaryWrite(bytes);
Response.Flush();
Response.End();
数据表格,查询、导出共用一个form表单,实现文件流方式下载的更多相关文章
- Vue + Element-ui实现后台管理系统(5)---封装一个Form表单组件和Table表格组件
封装一个Form表单组件和Table组件 有关后台管理系统之前写过四遍博客,看这篇之前最好先看下这四篇博客.另外这里只展示关键部分代码,项目代码放在github上: mall-manage-syste ...
- 获取html 中的内容 将前台的数据获取到后台 用 jquery 生成一个 form表单 提交数据
使用js创建一个form表单 ,使用post上传到后台中 下面是代码.在获取html内容的时候使用了js节点来获取内容. parent:父节点.上一级的节点 siblings:兄弟节点.同一级别的节点 ...
- 一个form表单对应多个submit
一个form表单多个submit 在平时项目开发过程中,经常会遇到一个form表单对应多个submit提交的情况,那么 ,这种情况应该怎么解决呢,也很简单,这时候就不能用submit来提交了,可以通过 ...
- JavaScript 创建一个 form 表单并提交
<!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8& ...
- 直接提交一个form表单后台返回一个新页面通过target属性可以放到iframe当中
问题描述: 我想提交一个form表单后台直接返回一个新页面,但是当前页面还不想被替换掉: 解决方案: 在页面中添加一个iframe将form表单的target属性设置为iframe的id这样的话返回的 ...
- Ajax提交Form表单及文件上传
刚刚申请下来的博客,写得第一篇.有点小激动,本人以前是一名工业3D设计师突然有些变故做上了JavaWeb开发: 前几天,发现了一些小问题.我在写后台管理页面时,需要上传一张图片.于是我就用很普通的Fo ...
- BootStrap的table表格,栅格系统,form表单的样式
BootStrap BootStrap的简介 1. 什么是Bootstrap 由两个前端设计师开发的一个前端的框架(Html,css,js) 简化了程序员写css的代码 2. 为什么使用B ...
- 遇到的一个Form表单自动提交问题解决办法
Form 表单中只有一个 input 元素时按回车会默认提交表单.有的时候我们希望按回车可以进行列表查询,但是查询后表单被自动提交了,然后刷新了整个页面.这个时候就需要对这个 Form 表单处理一下以 ...
- Django的form表单之文件上传
在生成input标签的时候可以指定input标签的类型为file类型 <!DOCTYPE html> <html lang="en"> <head&g ...
随机推荐
- ASPose导出excel简单操作
string file = FileDialogHelper.SaveExcel(string.Format("{0}.xls", excelName)); if (!string ...
- enum和int、string的转换操作
enum Countries{ 中国 = 5, 美国, 俄罗斯, 英国, 法国} enum 和 int enum -> intint num = (int)Coun ...
- 实现Android包的批量删除
由于手机内存有限,有时需要一次删除很多个包,这时就需要一个实现Android包批量删除的应用. 首先是布局文件: <?xml version="1.0" encoding=& ...
- Firemonkey 载入 Style 皮肤 (*.fsf 二进制文件) 速度测试
说明:Firemonkey 可以换肤是一大亮点,但使用它必须要付出一点代价,就是需要一点载入的时间,下面以 *.fsf 二进制文件来做载入测试,有兴趣可以参考看看. 开发:XE8 for iOS 皮肤 ...
- AngularJS的ng-click传参
<ul id="dataSet" ng-repeat="item in infos" ng-model="dataSet"> & ...
- 十大Intellij IDEA快捷键
转载:http://blog.csdn.net/dc_726/article/details/42784275 Intellij IDEA中有很多快捷键让人爱不释手,stackoverflow上也有一 ...
- String类型中ToString hashCode equals compareTo等方法的经典实现
private final char value[]; private int hash; // Default to 0 public String(String original) { this. ...
- 免费 PSD 素材:25个全新的界面设计资源
在这篇文章中,我们给大家收集了25套全新的 UI 设计素材.这些来自优秀设计师的 PSD 源文件素材让其它的设计师们在设计用户界面原型的时候能够非常便利. 网站用户界面,移动应用程序用户界面和对设计师 ...
- OpenGL中旋转平移缩放等变换的顺序对模型的影响
l 前提: 0x01. 假设绘制顶点的语句为Draw Array,变换的语句(旋转.平移.缩放)为M,而 M0; M1; M2; Draw Array; 则称对Array先进行M2再进行M1.M0 0 ...
- VMware虚拟机无法访问外网
1.环境条件 2.VMware检查 3.虚拟机检查 1) vi /etc/sysconfig/network ----------------------------- NETWORKING=yes ...