我正在为web应用程序使用Flex 10。
我需要保存一个二进制文件,该文件是在Flex中从web服务接收的。要做到这一点,我需要使用FileReference.save(),它必须由用户事件(鼠标或键盘)调用,以满足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:某些操作,例如显示弹出窗口的操作窗口,只能在用户交互时调用,例如由单击鼠标或按下按钮。
有人想办法解决这个问题吗?我需要在用户调用的函数中运行FileReference。
提前谢谢。
您可以通过强制用户单击某个按钮来欺骗这一点,并仅在此时保存在磁盘上。
我所做的是显示一条Alert消息,告诉用户文件已经成功生成,并在Alert handle函数上调用save方法。
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");
}