PHP / Actionscript 3 загрузка нескольких файлов с индикатором прогресса - PullRequest
2 голосов
/ 29 мая 2011

Я пытаюсь загрузить файлы изображений на свой сервер, используя 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: Как сделать так, чтобы браузер файлов появлялся при нажатии, а не при загрузке флэш-файла?

Если бы вы, ребята, могли бы опубликовать одну или две ссылки на хорошие учебные пособия / ресурсы или несколько советов, может быть, даже один или два фрагмента кода, которые очень помогли бы, так как я новичок в ActionScript 3.

Спасибо заранее!

1 Ответ

4 голосов
/ 30 мая 2011

Чтобы ответить на ваши вопросы в последовательности:

1: вы можете использовать ProgressEvent для отображения прогресса загрузки файла.Поскольку File будет диспетчером события, вы можете получить доступ к FileReference, который отправил ход выполнения, как e.currentTarget внутри события, и отсюда вы можете получить доступ к уникальным свойствам этой ссылки на файл, чтобы вы могли точно обновить визуальную загрузку.прогресс для этого конкретного файла.Например:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...