繁体   English   中英

Flex的FileReference.save()只能在用户事件处理程序中调用 - 我该如何解决这个问题?

[英]Flex's FileReference.save() can only be called in a user event handler — how can I get around this?

我需要在Web服务调用完成后调用FileReference.save(),但此方法有一个限制:“在Flash Player中,您只能成功调用此方法以响应用户事件(例如,在事件处理程序中)用于鼠标单击或按键事件。)否则,调用此方法会导致Flash Player抛出错误异常。“ (来自此处的文档)

这种限制有点模糊。 这是否意味着我只能从事件处理函数中调用FileReference.save()方法,该函数被注册为某些类型的用户事件的侦听器? 如果是,那么究竟哪些用户事件有效? (也许有一个事件永远不会被用户与我的应用程序交互调度,我可以为该事件类型注册事件处理函数并从该函数中调用save()?)

我的困难是我无法安全地调用FileReference.save()方法,直到我的Web服务返回将用作FileReference.save()方法调用的参数的数据,因此触发FileReference的事件。 save()调用实际上是一个ResultEvent而不是一个用户事件,我很谨慎地调度一个新的(虚假)用户事件类型,以便能够触发FileReference.save()调用,除非它肯定是一个用户事件,永远不会因实际用户与我的应用程序交互而被调度。

简而言之,我现在正在做的是:我有一个注册为按钮点击的处理程序的函数。 在此函数中,我进行Web服务调用以从服务器获取数据。 我还有一个结果处理函数,它在Web服务调用完成时被调用,而在这里我想调用FileReference.save()方法,因为此时我知道数据已准备好保存到一份文件。 但上述限制阻止我这样做 - 我收到一个错误:

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.save()调用的第二个鼠标单击事件处理函数,并在超时间隔后调用它(以便让Web服务时间完成),但我保留了遇到同样的错误 - 也许这种方法不起作用,因为第二个函数没有注册为用作其参数的事件类型的事件监听器。

我是Flex开发的新手,所以也许我只是没有以正确的方式思考这个问题。 如果有人可以提出另一种方法,我会非常感激。 提前感谢您的意见或建议。

- 詹姆士

Adobe将此作为一种安全措施,以确保用户是那些搞乱文件而不是潜在有害代码的人。 我的理解是,他们通过仅允许源自UI组件的(click?)事件的处理程序来执行此操作来执行FileReference方法,因此以编程方式生成您自己的事件将无法工作,尽管我还没有尝试验证这一点。 不幸的是,我发现的最佳解决方案是重新使用UI以符合此约束。 在您的特定情况下,您可以使用一个类似“准备下载”的按钮进行双击处理,该按钮在Web服务完成后更改为“下载文件”。 从用户的角度来看,这不太理想,但我认为除非您能够在显示触发FileReference.save()调用的按钮之前以某种方式完成Web服务调用,否则还有很多其他事情可以完成。

经过努力奋斗,几个小时后我找到了一个解决方法:你可以同时使用mouseDown和mouseUp事件而不是单击。

例如:s:Button mouseDown =“prepare_PDF()”mouseUp =“save_PDF()”

对我来说工作正常!

快乐的编码!

- 托马斯

作为一种解决方法,我使用了ExternalInterface类。 我用这段代码创建了一个javascript函数

function downloadFile (url) {
            window.open(url);
        }

我打电话给AS3

var url = 'www.example.com/downloadfile.php?file_id=xxx';
ExternalInterface.call('downloadAttachmentFile', url);

因此,我将文件处理转移到JS / HTML。

我有同样的问题,我选择使用flash.net方法。 调用flash.net.navigateToURL(url); 来自actionscript或navigateToURL(url); 来自mxml。

我要解决这个问题是显示一个匿名函数的警报消息,所以我不必创建一个按钮。

Alert.show("Do you wish to download the file?", "Confirm", Alert.OK | Alert.CANCEL, this, function (eventObj:CloseEvent):void {
                                                                                                    if (eventObj.detail == Alert.OK) {
                                                                                                        fileReference.save(zipOut.byteArray, dateFormater_titulo.format(new Date ()) + ".zip");
                                                                                                    }//if
                                                                                                 }/*function*/, null, Alert.OK);

这是对托马斯回答的评论(我还没有足够的评论来评论): mousedownmouseup解决方法效果很好。 请注意,如果你在prepare_PDF()中进行任何需要在save_PDF() “撤消”的save_PDF() ,那么最好在mouseout事件上调用该代码,因为可能存在用户mousedown on的情况。按钮,但然后将鼠标移离按钮。

这与我的情况特别相关,当用户点击下载按钮(触发.save()调用时),我们会增加图像上水印的大小。 我在mousedownmouseout事件上将水印的大小减小到正常。

暂无
暂无

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

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