我正在使用Flex 10进行Web应用程序。
我需要保存从Web服务在Flex中接收的二进制文件。为此,我需要使用 FileReference.save(),必须由用户事件(鼠标或键盘)调用Flex才能满足Flex的安全要求。总体思路如下:
protected function cmdSave(event:MouseEvent):void{
var inp:String = webService.getString("fieldBinary"); //here I get the data
var base64Dec:Base64Decoder = new Base64Decoder();
base64Dec.decode(inp);
var byteArray:ByteArray = base64Dec.toByteArray();
var fileRef:FileReference = new FileReference();
fileRef.save(byteArray, "output.pdf");
}
现在我的问题是使用Web服务的方法是同步的。因此,我的原始函数应该分成两部分,并且在用户事件触发的函数中不执行对FileReference.save()的调用,而是在de web服务触发的函数中执行,如:
protected function cmdSave(event:MouseEvent):void{
responseFunction=cmdSave_End;
methodToCallWebService(responseFunction);
}
protected function cmdSave_End(event:Ws_Event):void{
var webService = Ws_event.getResult();
var inp:String = webService.getString("fieldBinary"); //here I get the data
var base64Dec:Base64Decoder = new Base64Decoder();
base64Dec.decode(inp);
var byteArray:ByteArray = base64Dec.toByteArray();
var fileRef:FileReference = new FileReference();
fileRef.save(byteArray, "output.pdf");
}
(我省略了大部分代码)
此时,FileReference会抛出此错误:
错误#2176:某些操作,例如显示弹出窗口的操作 窗口,只能在用户交互时调用,例如通过a 鼠标点击或按下按钮。
有人会想办法解决这个问题吗?我需要在用户调用的函数中运行FileReference。
提前致谢。
答案 0 :(得分:1)
您可以通过强制用户单击某个按钮并仅在此时保存在磁盘上来解决此问题。
我所做的是显示一条警告消息,告诉用户该文件已成功生成,并在警报句柄函数中调用保存方法。
private var _byteArray:ByteArray;
protected function cmdSave(event:MouseEvent):void
{
responseFunction=cmdSave_End;
methodToCallWebService(responseFunction);
}
protected function cmdSave_End(event:Ws_Event):void{
var webService = Ws_event.getResult();
var inp:String = webService.getString("fieldBinary"); //here I get the data
var base64Dec:Base64Decoder = new Base64Decoder();
base64Dec.decode(inp);
_byteArray = base64Dec.toByteArray();
Alert.show("File content was generated", "Info", Alert.OK, this, alertClickHandler);
}
// Event handler function for Alert
private function alertClickHandler(evt:CloseEvent):void
{
var fileRef:FileReference = new FileReference();
fileRef.save(_byteArray, "output.pdf");
}