数据表格,查询、导出共用一个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, 0, 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();

 

转载于:https://www.cnblogs.com/zzgblog/p/4720503.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值