代码之家  ›  专栏  ›  技术社区  ›  ketan

在flex web应用程序中下载多个文件而无需用户交互?

  •  -1
  • ketan  · 技术社区  · 11 年前

    在问问题之前,我说要正确阅读问题。
    我正在创建 web应用程序 下载视频文件。
    我将在其中创建类似的功能。用户选择要下载的多个文件。
    视频URL来自网络服务。

    问题:
    现在,当用户单击 下载 然后打开flex中的新页面。
    现在,假设有5个文件要下载,那么它将自动开始下载第一个文件。其显示下载的进度。
    下载完第一个文件后,开始下载第二个文件,然后下载第三个文件,依此类推。

    文件在浏览器的默认路径中下载 在flex代码中指定。文件大小可能很大。(超过 500兆字节 ).

    我找了很多,但没有找到合适的解决方案 它说没有用户交互是不可能的。

    但是,如果需要用户交互,则用户必须持续观看以下载那个大文件,然后需要下载第二个文件。

    是否可以使用flex?如果是,那么如何?

    任何帮助都将不胜感激。
    谢谢

    3 回复  |  直到 11 年前
        1
  •  0
  •   Aaron Beall    11 年前

    正如你所说的问题,这是不可能的。

    在web Flash Player中,您只有两个选项:

    1. 使用 FileReference/save() 这需要用户选择保存文件的位置。
    2. 使用 navigateToURL() 将浏览器指向文件位置,这样浏览器就可以决定如何处理下载——立即将其下载到默认的下载目录,或由用户选择。这并不可靠。(其变体是使用 ExternalInterface 调用JS window.open ,这是相当于 navigateToURL .)

    在这两种情况下,您都无法选择从Flex下载文件的位置,甚至无法知道他们在哪里下载文件,而且在没有用户交互(如单击按钮)的情况下,无法使用这些选项。

    使用AIR(桌面应用程序),您可以使用 File FileStream .

        2
  •  0
  •   gabriel    11 年前

    创建一个方法来加载文件(提供文件路径作为参数或使用Array或Vector以及所有相应的URL)。完成第一次下载后,检查数组中是否有更多项,如果有,则加载后续索引。用户不需要进行任何交互。

    带有init、progress和complete状态的加载器示例。

    var myLoader:Loader = new Loader();
    
    myLoader.contentLoaderInfo.addEventListener(Event.INIT, initListener);
    myLoader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, progressListener);
    myLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeListener);
    
    myLoader.load(new URLRequest("yourFile.png"));
    
    function initListener(event:Event):void
    {
        // just started the loader process
        trace("Object Initialized");
    }
    
    function progressListener (event:ProgressEvent):void
    {
        trace("Downloaded " + event.bytesLoaded + " out of " + event.bytesTotal + " bytes");
    }
    
    function completeListener(event:Event):void
    {    
         // here you can load the next file
         trace("Loading Completed");
    }
    
        3
  •  0
  •   akmozo    11 年前

    出于Flash播放器的安全原因,如果没有用户交互,在后台模式下下载文件是不可能的。我做了一些类似于你为网络电视项目所做的事情,用户可以下载视频及其附件(数百个),为此我使用了服务器端 PHP script 这叫做使用 navigateToURL() 下载视频文件和包含所有附加文件的zip(PHP脚本调用两次)。

    因此,您可以这样做:

    PHP:

    <?php
    
        // some controls here
    
        $file = $_GET['f'];
    
        if (file_exists($file)) {
            header('Content-Description: File Transfer');
            header('Content-Type: application/octet-stream');
            header('Content-Disposition: attachment; filename='.basename($file));
            header('Expires: 0');
            header('Cache-Control: must-revalidate');
            header('Pragma: public');
            header('Content-Length: '.filesize($file));
            readfile($file);
            exit();
        }
    
    ?>
    

    操作脚本:

    const download_url:String = 'http://www.example.com/download.php?f=';
    var files:Array = ['01.mp4', '02.mp4', '03.mp4', '04.mp4', '05.mp4'];
    var index:int = 0;
    
    var timer:Timer = new Timer(100, files.length);
        timer.addEventListener(
            TimerEvent.TIMER, 
            function(e:TimerEvent){
                navigateToURL(new URLRequest(download_url + files[index]));
                index ++;
            }
        )
        timer.start();
    

    当然,此代码将通过浏览器下载文件,作为用户下载的任何文件。请注意,有时浏览器会阻止下载,因为它被认为是一个弹出窗口,所以您必须向您的用户提及这一点,以授予您的网站下载文件的权限。

    这段代码只是一个示例,向您展示了如何做您想要的事情,可能是因为您在服务器中没有使用PHP,所以您必须改进并使其适应您的特定需求。

    希望这能有所帮助。