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

Save in flex a file get by web service

我正在使用 Flex 10 开发 Web 应用程序。

我需要保存在 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 抛出此错误:

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.

有人想办法解决这个问题吗?我在用户调用的函数中需要 FileReference 运行。

提前致谢。

您可以通过强制用户单击某个按钮并仅在该点保存到磁盘来解决这个问题。

我所做的是显示一条警告消息,告诉用户文件已成功生成,并在警告句柄函数上调用保存方法。

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");
}