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

hfsqlsce  于 2022-11-01  发布在  Apache
关注(0)|答案(6)|浏览(147)

我需要FileReference.save在Web服务调用完成后调用www.example.com(),但此方法有一个限制:“在Flash Player中,只有在响应用户事件(例如,在鼠标单击或按键事件的事件处理函数中)时才能成功调用此方法。否则,调用此方法会导致Flash Player引发Error异常。”(来自此处的文档)
这个限制有点模糊。这是否意味着我只能FileReference.save从注册为特定类型用户事件的侦听器的事件处理函数中调用www.example.com()方法?如果是,那么究竟哪些用户事件是有效的?(可能有“这是一个永远不会由用户与我的应用程序交互来调度的事件,我可以为该事件类型注册一个事件处理函数,然后是否从该函数中调用保存()?)
我的困难在于,FileReference.save在Web服务返回将用作FileReference.save()方法调用的参数的数据之前,我无法安全地调用www.example.com()方法,因此触发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开发的新手,所以也许我只是没有以正确的方式思考这个问题。如果有人能提出其他方法,我将非常感激。提前感谢您的意见或建议。
--詹姆斯

lzfw57am

lzfw57am1#

Adobe这样做是一种安全措施,以确保用户是那些搞乱文件的人,而不是那些潜在的有害代码。(click?)事件来执行FileReference方法,因此以程序设计方式产生您自己的事件将无法运作,但是我发现最好的解决方案是对UI进行一些修改以符合此约束。在您的特定情况下,你可以通过一个类似“准备下载”的按钮来完成这个过程,当网络服务完成后,这个按钮会变成“下载文件,”从用户的Angular 来看,这并不理想,但我认为除了在显示触发www.example.com()调用的按钮之前以某种方式完成Web服务调用之外,没有什么其他的事情可以做FileReference.save。

rqenqsqc

rqenqsqc2#

经过几个小时的努力,我找到了一个变通办法:您可以同时使用mouseDown和mouseUp事件,而不仅仅是单击。
例如:如果您想创建一个PDF文件,请点击下面的按钮。
对我来说很好用!
快乐编码!
--托马斯

klr1opcd

klr1opcd3#

作为一种解决方法,我使用了ExternalInterface类。

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

我调用AS 3中的

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

因此,我将文件处理转换为JS/HTML。

14ifxucb

14ifxucb4#

这是对托马斯的回答的评论(我还没有足够的XP来评论):mousedownmouseup的解决方案工作得很好。只是需要注意的是,如果你在prepare_PDF()中做了任何需要在save_PDF()中“撤消”的更改,那么在mouseout事件中调用该代码也是一个好主意,因为可能会有这样的情况,用户鼠标按下按钮,但随后将鼠标从按钮上移开。
这与我的例子特别相关,在这个例子中,当用户单击下载按钮(触发.save()调用)时,我们增加了图像上水印的大小。

ybzsozfc

ybzsozfc5#

我也遇到了同样的问题,我选择使用flash.net方法。从actionscript调用flash.net.navigateToURL(url);或从mxml调用navigateToURL(url);

ghhkc1vu

ghhkc1vu6#

为了解决这个问题,我用一个匿名函数显示一条警告消息,这样我就不必创建一个按钮了。

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

相关问题