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

时间:2015-03-04 07:00:01

标签: actionscript-3 flex download actionscript

在提出问题之前,我说正确阅读了什么是问题 我正在为下载视频文件创建 Web应用程序 我将在其中创建类似的功能。用户选择要下载的多个文件。
视频URL来自webservice。

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

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

我搜索了很多但是没有得到任何正确的解决方案。它说没有用户互动就不可能。

但是,如果需要用户交互,那么用户必须不断观看下载该大文件,然后需要采取措施下载第二个文件。

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

任何帮助都会表示赞赏 谢谢,

3 个答案:

答案 0 :(得分:0)

创建一个加载文件的方法(将文件路径作为参数或使用包含所有相应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");
}

答案 1 :(得分:0)

正如您所说的那样,不可能这样做。

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

  1. 使用FileReference/save(),要求用户选择保存文件的位置。
  2. 使用navigateToURL()将浏览器指向文件位置,让浏览器决定如何处理下载 - 立即将其下载到默认下载目录,或让用户选择。这不可靠。 (这种方法的一个变体是使用ExternalInterface来调用JS window.open,这是与navigateToURL等效的JS。)
  3. 在任何一种情况下,您都无法选择从Flex下载文件的位置,甚至不知道他们下载文件的位置,并且您无法在没有用户交互的情况下使用这些选项中的任何一个(例如单击按钮)。

    使用AIR(桌面应用程序),您可以使用FileFileStream执行此操作。

答案 2 :(得分:0)

对于Flash播放器安全原因如果没有用户交互,则无法在后台模式下载文件。我的工作类似于你正在为网络电视项目做的事情,用户可以下载视频及其附加文件(数百个),因为我使用的服务器端PHP script使用{{3}进行调用下载视频文件和包含所有附加文件的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();
    }

?>

ActionScript:

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,因此您必须根据您的特定需求进行改进和调整。

希望可以提供帮助。