2013-03-01 75 views
0

我想從我的數據庫中導出一個表格到服務器上的excel文件,然後下載它。下面是我爲這個目的而開發的代碼:如何使用Flex下載動態創建的服務器端文件?

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(請求)功能導致以下錯誤:

Error #2176: Certain actions, such as those that display a pop-up window, may only be invoked upon user interaction, for example by a mouse click or button press.

任何意見將不勝感激。 謝謝

回答

1

你不能做你想做的。安全限制可以防止您的應用在沒有用戶輸入的情況下嘗試下載任何內容到客戶端機器。這就是你看到錯誤的原因。

我建議在服務器上創建Excel表格,將其保存到服務器,然後將URL發送回您的Flex應用程序。使用navigateToURL()打開它;瀏覽器應該根據客戶端的瀏覽器設置來處理它。它可以自動下載;或自動打開;或者它可能會提示用戶想要做什麼。

如有必要,您可以創建一個服務器端腳本來定期清理生成的文件。

根據您提供的代碼,它看起來像你有90%的方式。只需使用navigateToURL()來打開該URLRequest,而不是使用FileReference嘗試下載文件。

或者,您可以修改您的用戶界面以表示「您的文件已準備就緒,請點擊此處獲取」或類似內容。然後你有用戶交互,並可以在用戶點擊按鈕後打開下載窗口。

+0

太棒了!我錯過了安全觀點。非常感謝。 – Fred 2013-03-01 20:44:16

相關問題