Actionscript 3 在flex 4或flex 4.5中,如何在没有用户交互的情况下从服务器下载文件?

Actionscript 3 在flex 4或flex 4.5中,如何在没有用户交互的情况下从服务器下载文件?,actionscript-3,apache-flex,flex4,flex4.5,filereference,Actionscript 3,Apache Flex,Flex4,Flex4.5,Filereference,代码流程如下所示: <fx:Script> <![CDATA[ import mx.rpc.CallResponder; import mx.rpc.events.FaultEvent; import mx.rpc.events.ResultEvent; protected function downloadButtonClickHandler(event:MouseEvent)

代码流程如下所示:

<fx:Script>
    <![CDATA[            

        import mx.rpc.CallResponder;
        import mx.rpc.events.FaultEvent;
        import mx.rpc.events.ResultEvent;

        protected function downloadButtonClickHandler(event:MouseEvent):void 
        { 
                var web_service:IWeb_service = Web_service.getInstance(); 
                getDetails.token = web_service.getURLDetails();
        } 

        public function onGetDetailsResult(event:ResultEvent):void
        {

            var response:URLResponse = event.result as URLResponse;
            if(response != null && response.url != null)
            { 
                var request:URLRequest = new URLRequest(response.url);
                fileReference.download(request, "test.html");
            }
        }

        public function onGetDetailsFault(event:FaultEvent):void
        {
            Alert.show("Error in downloading details");
        }
    ]]>    
</fx:Script>

<fx:Declarations>  
    <net:FileReference id="fileReference" />
    <s:CallResponder id="getDetails" result="onGetDetailsResult(event)" fault="onGetDetailsFault(event)"/>

</fx:Declarations>
<s:HGroup width="100%" height="100%">

       <s:Button label="Download Details" id="downloadButton" 
                          click="downloadButtonClickHandler(event)" /> 
</s:HGroup>
用户单击页面上的“下载详细信息”按钮->打开按钮单击处理程序使用s:CallResponder->RPC方法调用RPC方法生成并返回从何处下载文件的URL->CallResponder的成功事件处理程序获取FileReference.download()的URL用于下载文件,但引发以下错误:-

错误:错误#2176:某些操作,例如显示弹出窗口的操作,只能在用户交互时调用,例如通过单击鼠标或按下按钮。 在flash.net::FileReference/download()上

代码如下:

<fx:Script>
    <![CDATA[            

        import mx.rpc.CallResponder;
        import mx.rpc.events.FaultEvent;
        import mx.rpc.events.ResultEvent;

        protected function downloadButtonClickHandler(event:MouseEvent):void 
        { 
                var web_service:IWeb_service = Web_service.getInstance(); 
                getDetails.token = web_service.getURLDetails();
        } 

        public function onGetDetailsResult(event:ResultEvent):void
        {

            var response:URLResponse = event.result as URLResponse;
            if(response != null && response.url != null)
            { 
                var request:URLRequest = new URLRequest(response.url);
                fileReference.download(request, "test.html");
            }
        }

        public function onGetDetailsFault(event:FaultEvent):void
        {
            Alert.show("Error in downloading details");
        }
    ]]>    
</fx:Script>

<fx:Declarations>  
    <net:FileReference id="fileReference" />
    <s:CallResponder id="getDetails" result="onGetDetailsResult(event)" fault="onGetDetailsFault(event)"/>

</fx:Declarations>
<s:HGroup width="100%" height="100%">

       <s:Button label="Download Details" id="downloadButton" 
                          click="downloadButtonClickHandler(event)" /> 
</s:HGroup>


有没有其他方法可以实现这一点,因为File FileReference需要用户交互,而这种交互在本例中没有发生?

在用户单击下载按钮之前(例如在创建flex应用程序之后)调用
web\u服务.getURLDetails()
。如果加载了url,您可以检查
下载按钮ClickHandler
方法,或者您可以从禁用按钮开始,并在加载url后将状态更改为启用。

由于安全限制,我认为没有办法通过
文件引用下载文件,如果您事先没有可用的文件

据我所知,有两种方法可以处理这种情况:

  • 通过单独的按钮点击触发
    FileReference
    下载(例如警报对话框)
  • 通过
    navigateToURL(myURLRequest,“_self”)启动浏览器的标准下载

  • 希望这有帮助。

    在用户单击“下载”之前加载下载url是否不可行?您可以在用户实际需要指定本地下载位置之前下载文件。唉,你不能只把文件保存在你想在用户计算机上的任何地方,因为这将是一个主要的安全漏洞。
    var url:String = "test.xls";
    
    var fileReference:FileReference = new FileReference; 
    var urlRequest:URLRequest = new URLRequest(url);
    navigateToURL(urlRequest,"_new");
    
    fileReference.download(urlRequest);