将web服务获取的文件保存在flex中



我正在为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");
}

相关内容

  • 没有找到相关文章

最新更新