如何使用Flex下载动态创建的服务器端文件?

时间:2013-03-01 20:21:45

标签: flex

我想将数据库中的表格导出到服务器上的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:某些操作(例如显示弹出窗口的操作)只能在用户交互时调用,例如通过鼠标单击或按下按钮。

非常感谢任何建议。 谢谢

2 个答案:

答案 0 :(得分:1)

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

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

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

根据您提供的代码,您看起来就像90%一样。只是不使用FileReference尝试下载文件,而是使用navigateToURL()打开该URLRequest。

或者,您可以修改您的用户界面,说“您的文件已准备好,点击此处获取”或类似内容。然后您可以进行用户交互,并在用户单击按钮后打开下载窗口。

答案 1 :(得分:1)