代码流程如下:
用户单击页面上的"下载详细信息"按钮->在按钮上单击处理程序,使用s调用RPC方法:CallResponder -> RPC方法生成并返回下载文件的URL -> CallResponder的成功事件处理程序获取FileRefrence.download()用于下载文件的URL,但抛出以下错误:-
Error: Error #2176:某些操作,例如那些显示弹出窗口的操作,可能只能在用户交互时调用,例如通过单击鼠标或按下按钮。在flash.net: FileReference/下载()
代码如下:
<fx:Script>
<![CDATA[
import mx.rpc.CallResponder;
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;
protected function downloadButtonClickHandler(event:MouseEvent):void
{
var web_service:IWeb_service = Web_service.getInstance();
getDetails.token = web_service.getURLDetails();
}
public function onGetDetailsResult(event:ResultEvent):void
{
var response:URLResponse = event.result as URLResponse;
if(response != null && response.url != null)
{
var request:URLRequest = new URLRequest(response.url);
fileReference.download(request, "test.html");
}
}
public function onGetDetailsFault(event:FaultEvent):void
{
Alert.show("Error in downloading details");
}
]]>
</fx:Script>
<fx:Declarations>
<net:FileReference id="fileReference" />
<s:CallResponder id="getDetails" result="onGetDetailsResult(event)" fault="onGetDetailsFault(event)"/>
</fx:Declarations>
<s:HGroup width="100%" height="100%">
<s:Button label="Download Details" id="downloadButton"
click="downloadButtonClickHandler(event)" />
</s:HGroup>
有没有其他的方法来实现这个文件FileReference需要一个用户交互,而不是发生在他的情况下?
我认为没有办法通过FileReference
下载文件,由于安全限制,如果你事先没有文件可用。
据我所知,有两个选项来处理这种情况:
- 触发
FileReference
下载通过单独的按钮点击(例如警报对话框); - 通过
navigateToURL(myURLRequest, "_self");
启动浏览器标准下载
var url:String = "test.xls";
var fileReference:FileReference = new FileReference;
var urlRequest:URLRequest = new URLRequest(url);
navigateToURL(urlRequest,"_new");
fileReference.download(urlRequest);
在用户单击下载按钮之前调用web_service.getURLDetails()
(例如在创建flex应用程序之后)。你可以在downloadButtonClickHandler
方法中检查url是否被加载,或者你可以从一个禁用按钮开始,并在url被加载后将状态更改为启用。