简体   繁体   English

将flex文件保存通过Web服务获取

[英]Save in flex a file get by web service

I'm working with Flex 10 for web applications. 我正在使用针对Web应用程序的Flex 10。

I need to save a binary file which is received in Flex from a web service. 我需要保存从Web服务在Flex中接收到的二进制文件。 To do this I need to use FileReference.save() , which must be invoked by a user event (mouse or keyboard) for security requirements of Flex. 为此,我需要使用FileReference.save() ,该请求必须由用户事件(鼠标或键盘)调用才能满足Flex的安全要求。 The general idea is as follows: 总体思路如下:

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

Now my problem is that the method to consume a web service is synchronous. 现在我的问题是,使用Web服务的方法是同步的。 Therefore, my original function should split in two, and the call to FileReference.save() is not performed in the function triggered by the user event, but in the function triggered by de web service, something like: 因此,我的原始函数应该一分为二,并且对FileReference.save()的调用不是在用户事件触发的函数中执行,而是在由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");
}

(I omit most of the code) (我省略了大部分代码)

At this time, FileReference throws this error: 这时,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. 错误#2176:某些操作(例如显示弹出窗口的操作)只能在用户交互时调用,例如通过单击鼠标或按下按钮。

Would anyone think a way to fix this? 有人会想办法解决这个问题吗? I need FileReference run in the function invoked by the user. 我需要在用户调用的函数中运行FileReference。

Thanks in advance. 提前致谢。

You can trick this by forcing the user to click some button and save on disk only at that point. 您可以通过强迫用户单击某些按钮并仅在那时将其保存在磁盘上来欺骗它。

What I did was to show an Alert message telling the user that the file has been successfully generated, and on the alert handle function call the save method. 我要做的是显示一条警告消息,告诉用户文件已成功生成,并在警告句柄功能上调用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");
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM