如何捕获文件保存为取消响应

时间:2010-11-16 20:22:21

标签: php javascript

我按照这篇文章http://www.the-art-of-web.com/php/dataexport/成功创建了一个从DB导出到csv文件,基于用户当前搜索视图。但是为了防止在导出发生时命中db,所以我禁用导出,除非视图或用户查询中有更改。我面临的问题是当用户点击导出文件时保存为确认对话框弹出,如果用户改变主意,请单击取消。导出按钮保持禁用状态。用户返回的唯一方法是更改​​查询并再次返回。

我的问题是,无论如何我可以捕获取消点击响应文件另存为确认对话框。

由于

代码与http://www.the-art-of-web.com/php/dataexport/非常相似,因为视图将是一个网格,其中包含来自给定日期范围的大量客户信息。如果用户喜欢他们选择的视图。他们会点击导出按钮。

示例代码 export.php

function exportCSV(){
  document.getElementById("exportCSV").src = "test1.php";
  document.getElementById("exportBtn").disabled = true;
}

function performSearch(){
  //perform search get result and display
  //if resultset length > 0
  document.getElementById("exportBtn").disabled = false;
}

网格显示就在这里  < button id =“search”onclick =“performSearch()”>搜索
 < button id =“exportBtn”onclick =“exportCSV()”>出口
 < iframe id =“exportCSV”style =“display:none”/>

test1.php

$ data = array(
       array(“firstname”=>“Mary”,“lastname”=>“Johnson”,“age”=> 25),
       array(“firstname”=>“Amanda”,“lastname”=>“Miller”,“age”=> 18),
       array(“firstname”=>“James”,“lastname”=>“Brown”,“age”=> 31),
       array(“firstname”=>“Patricia”,“lastname”=>“Williams”,“age”=> 7),
       array(“firstname”=>“Michael”,“lastname”=>“Davis”,“age”=> 43),
       array(“firstname”=>“Sarah”,“lastname”=>“Miller”,“age”=> 24),
       array(“firstname”=>“Patrick”,“lastname”=>“Miller”,“age”=> 27)
     );

#filename供下载  $ filename =“website_data.xls”;

header(“Content-Disposition:application / octet-stream; filename = \”$ filename \“”);
 header(“Content-Type:application / vnd.ms-excel”);

$ flag = false;
 foreach($ data as $ row){
   if(!$ flag){
     #显示字段/列名称作为第一行
     echo implode(“\ t”,array_keys($ row))。 “\ n” 个;
     $ flag = true;
   }
   array_walk($ row,'cleanData');
   echo implode(“\ t”,array_values($ row))。 “\ n” 个;
 }
 出口;

 function cleanData(&$str)
 {
   $str = preg_replace("/\t/", "\\t", $str);
   $str = preg_replace("/\r?\n/", "\\n", $str);
   if(strstr($str, '"')) $str = '"' . str_replace('"', '""', $str) . '"';
 }     

2 个答案:

答案 0 :(得分:0)

无法捕获浏览器事件以取消保存文件。在if语句中使用confirm(或类似的东西)可能是这种情况下最好的ux:

if(confirm('are you sure you want to export?'))
{
//export code
}
else
{
//cancel code
}

如果您希望重新启用导出按钮,则只要您调用用户的搜索(或他们为更改数据而执行的任何操作),我就会调用重新启用功能。或者,您也可以在点击导出按钮后使用setTimeout(),并在一段时间后重新启用它。

答案 1 :(得分:0)

也许你可以通过php脚本发送转储文件。在那里(再次:也许,我不知道,如果真的有效)可以用connection_status()测试连接状态。但是如果你通过php脚本发送文件,你就不需要知道状态了,因为如果脚本正常关闭,那么重要的是,如果传输完成了,如果你只想解锁数据库。

通常,正常的数据库转储是安全的。因此,如果您让数据库转储它包含的数据并将其保存到文件中,则在有人下载文件时没有理由锁定数据库。