PHP/Actionscript 3 带有进度指示器的多个文件上传

标签 php flash actionscript-3

我正在尝试使用 AS3 和 PHP 将图像文件上传到我的服务器,目前我成功上传了多个文件并将其限制为仅图像,但由于我是 Flash 和 AS3 的新手,我发现它很难弄清楚如何在文件上传时显示加载器栏,以及如何在所有文件上传后执行一个函数以转到指定的框架。

这是迄今为止我的代码,

AS3:

import flash.net.FileReferenceList;
import flash.events.Event;
import flash.net.URLRequest;
import flash.net.FileReference;

var fileRef:FileReferenceList = new FileReferenceList();
fileRef = new FileReferenceList();
fileRef.browse(new Array( new FileFilter( "Images (*.jpg, *.jpeg, *.gif, *.png)", "*.jpg;*.jpeg;*.gif;*.png" )));
fileRef.addEventListener(Event.SELECT, fileSelectHandler);

var uploadURL:URLRequest = new URLRequest();
var uploadPhotoScript:String = "http://127.0.0.1/upload.php";
uploadURL.url = uploadPhotoScript;

function fileSelectHandler(event:Event):void {
    for each(var fileToUpload:FileReference in fileRef.fileList){
            uploadSingleFile(fileToUpload);
        }
}

function uploadSingleFile(file:FileReference):void {
    file.upload(uploadURL);
    file.addEventListener(Event.COMPLETE, completeHandler);
}

function completeHandler(event:Event):void {
    trace("upload complete");
}

PHP:

if(!empty($_FILES)){
    $tmpfile = $_FILES['Filedata']['tmp_name'];
    $targetfile = dirname(__FILE__) . '/' . $_FILES['Filedata']['name'];
    move_uploaded_file($tmpfile, $targetfile);
}

我的问题是,

1:如何显示百分比或上传条来指示正在上传的文件的进度?

2:所有文件上传成功后如何启动回调函数?

3:如何让文件浏览器在点击时出现,而不是在加载 Flash 文件时出现?

如果你们可以发布一两个优秀教程/资源的链接或一些建议,甚至可能是一两个代码片段,这将是一个很大的帮助,因为我对 Actionscript 3 非常陌生。

提前致谢!

最佳答案

按顺序回答您的问题:

1:您可以使用ProgressEvent来显示文件上传进度。由于 File 将成为事件的调度程序,因此您可以访问已在事件内将进度作为 e.currentTarget 调度的 FileReference,并且从这里您可以访问该文件引用的独特属性,以便您可以准确地更新视觉上传该特定文件的进度。例如:

function uploadSingleFile(file:FileReference):void {
    file.addEventListener(ProgressEvent.PROGRESS, onUploadProgress);
    file.upload(uploadURL);
    file.addEventListener(Event.COMPLETE, completeHandler);
}

function onUploadProgress(e:ProgressEvent):void
{
    var f:FileReference = e.currentTarget as FileReference;
    var fileName:String = f.name; //Now I know which file it is, I can update accordingly
    var progress:Number = (e.bytesLoaded / e.bytesTotal) * 100; //shows percent, you might want to round this off using Math.round(number);
}

2:为了在加载所有文件后启动回调,您可以通过存储最初选择的文件数量,然后专门为每个项目添加一个回调,并在它们完成时减少总计数,直到达到为0,此时你就会知道所有文件都已上传:

var totalFiles:int = 0;

function fileSelectHandler(event:Event):void {
    for each(var fileToUpload:FileReference in fileRef.fileList){
            ++totalFiles;
            uploadSingleFile(fileToUpload);            
        }
}

function uploadSingleFile(file:FileReference):void {
    file.addEventListener(ProgressEvent.PROGRESS, onUploadProgress);
    file.addEventListener(Event.COMPLETE, onFileUploadComplete);
    file.upload(uploadURL);
    file.addEventListener(Event.COMPLETE, completeHandler);
}

function onFileUploadComplete(e:Event):void
{
    --totalFiles;
    if(totalFiles == 0){
        //All files have been uploaded
    }
}

3:要使浏览器在单击时显示,只需将 MouseEvent.MOUSE_DOWN 监听器添加到某种对象或按钮,甚至舞台等。就像这样:

var uploadButton:Button = new Button(); // Note this will require the Button component to  be included in your library in flash CS

uploadButton.label = "Upload Files";
uploadButton.width = 150; //Or whatever;
uploadButton.x = (stage.stageWidth * .5) - (uploadButton.width * .5);
uploadButton.y = (stage.stageHeight * .5) - (uploadButton.height * .5);
stage.addChild(uploadButton);

uploadButton.addEventListener(MouseEvent.MOUSE_DOWN, onUploadClicked);

function onUploadClicked(e:MouseEvent):void
{
    var fileRef:FileReferenceList = new FileReferenceList();
    fileRef = new FileReferenceList();
    fileRef.browse(new Array( new FileFilter( "Images (*.jpg, *.jpeg, *.gif, *.png)", "*.jpg;*.jpeg;*.gif;*.png" )));
    fileRef.addEventListener(Event.SELECT, fileSelectHandler);
}

最后关于教程等,我推荐 http://gotoandlearn.com用于学习闪光。我还建议您查看 AS3 文档,因为所有这些 nfo 都可以通过查找相关类 FileReferenceList 来收集。请注意,这段代码是我凭空想象写出来的,所以我没有进行 IDE 检查或任何其他操作。不过它应该工作得很好。希望这可以帮助。 :)

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/net/FileReferenceList.html
http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/net/FileReference.html#upload ()

http://adobe.com/go/as3lr

关于PHP/Actionscript 3 带有进度指示器的多个文件上传,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6170072/

相关文章:

flash - 如何使用 URLRequest 发送自定义 header

apache-flex - 从文件 :///without having the user change their Flash Player security settings 运行 SWF

actionscript-3 - 我正在尝试测试文本输入框是否具有焦点

php - 加载页面时 session 的未定义索引错误

php - Facebook cookie 和 oauth 2.0 更改

php - 在 Laravel 模型中创建自定义变量/属性

java - 最佳批量照片上传小程序

php - 仅将压缩图像保存到数据库

performance - 在ActionScript 3中扩展类的负面影响是什么?

actionscript-3 - 在 ActionScript 3 中从一组坐标对创建多边形