0

我想将数据库中的表导出到服务器上的 excel 文件,然后下载。以下是我为此目的开发的代码:

 import flash.net.FileReference;
 import flash.net.URLRequest;
 public function sqlDownloadExcel():void {
      var http:HTTPService = new HTTPService;
      var parm:Object = new Object;
      var sql:String;

      sql = "insert into OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;Database=C:\\inetpub\wwwroot\\myApp\\App_Data\\myExport.xls;', 'SELECT * FROM [Sheet1$]')  SELECT * FROM myTable";
      parm.sql = sql;
      parm.db = "myDatabase"; 
      http.url = "http://mywebsite.com/SQLconnector/sqlconnector.asp?irand="+Math.random();
      http.showBusyCursor = true;
      http.request = sql;
      http.addEventListener(ResultEvent.RESULT, function(e:ResultEvent):void {sqlDownloadExcelResult(e);});
      http.addEventListener(FaultEvent.FAULT, mssqlFault);
      http.method = "POST"; 
      sqlToken = http.send(parm);
 }
 public function sqlDownloadExcelResult(event:ResultEvent):void{
      var request:URLRequest = new URLRequest("http://mywebsite/myApp/App_Data/myExport.xls");
      var fileRef:FileReference = new FileReference();
      fileRef.download(request);                
 }

该代码在服务器上正确创建 Excel 文件,但运行 fileRef.download(request) 函数会导致以下错误:

错误 #2176:某些操作(例如显示弹出窗口的操作)只能在用户交互时调用,例如通过鼠标单击或按钮按下。

任何建议将不胜感激。谢谢

4

1 回答 1

1

你不能做你想做的事。安全限制可防止您的应用在没有用户输入的情况下尝试将任何内容下载到客户端机器。这就是您看到错误的原因。

我建议在服务器上创建 Excel 表,将其保存到服务器,然后将 URL 发送回您的 Flex 应用程序。使用 navigateToURL() 打开它;并且浏览器应该根据客户端的浏览器设置来处理它。它可以自动下载;或自动打开;或者它可能会提示用户它想要做什么。

如有必要,您可以创建一个服务器端脚本来定期清理生成的文件。

根据您提供的代码,看起来您已经完成了 90% 的工作。与其使用 FileReference 尝试下载文件,不如使用 navigateToURL() 打开该 URLRequest。

或者,您可以修改您的 UI 以显示“您的文件已准备好,单击此处获取它”或类似的内容。然后你有用户交互并且可以在用户点击按钮后打开下载窗口。

于 2013-03-01T20:27:18.277 回答