0

我想上传多个文件。我在 fileList 数组中的每个元素上调用 FileReference.upload() 来上传文件。它可以工作(将所有文件上传到服务器),但我的消息和进度条不起作用。当我使用 FileReference 而不是 FileReferenceList 时它们可以工作。如何更正此代码以显示每个上传文件的进度和消息?

  package 
   {
import flash.display.*;
import flash.events.*;
import flash.text.*;
import flash.net.FileReference;
import flash.net.FileReferenceList;
import flash.net.FileFilter;
import flash.net.URLRequest;
import flash.utils.Timer;
import flash.events.TimerEvent;

public class Uploader extends MovieClip
{
    var file:FileReferenceList;
    var filefilters:Array;
    var req:URLRequest;
    var tm:Timer;
    var speed:Number = 0;
    var currbytes:Number = 0;
    var lastbytes:Number = 0;

    public function Uploader()
    {
        req = new URLRequest();
        req.url = 'http://.../upload.php';
        file = new FileReferenceList();
        setup( file );
        select_btn.addEventListener( MouseEvent.CLICK, browse );
        progress_mc.bar.scaleX = 0;
        tm = new Timer(1000);
        tm.addEventListener( TimerEvent.TIMER, updateSpeed );
        cancel_btn.addEventListener( MouseEvent.CLICK, cancelUpload );
        cancel_btn.visible = false;
      }

    public function browse( e:MouseEvent )
    {
        filefilters = [new FileFilter('Images','*.jpg')];// add other file filters
        file.browse( filefilters );
     }

     private function setup( file:FileReferenceList )
    {
        file.addEventListener( IOErrorEvent.IO_ERROR, io_error );
        file.addEventListener( Event.OPEN, open_func );
        file.addEventListener( ProgressEvent.PROGRESS, progress_func );
        file.addEventListener( Event.SELECT, selectHandler );
        file.addEventListener( DataEvent.UPLOAD_COMPLETE_DATA, show_message );
    }

    private function io_error( e:IOErrorEvent )
    {
        var tf = new TextFormat();
        tf.color = 0xff0000;
        label_txt.defaultTextFormat = tf;
        label_txt.text = 'The file could not be uploaded.';
        tm.stop();
        cancel_btn.visible = false;
        select_btn.visible = true;
     }

    private function open_func( e:Event )
    {
        tm.start();
        cancel_btn.visible = true;
        select_btn.visible = false;
    }

    private function progress_func( e:ProgressEvent )
    {


            progress_mc.bar.scaleX = e.bytesLoaded / e.bytesTotal;
            var tf = new TextFormat();
            tf.color = 0x000000;
            label_txt.defaultTextFormat = tf;
 label_txt.text = Math.round( (e.bytesLoaded/e.bytesTotal)*100)+'% uploaded '+speed+' kb/s';
            currbytes = e.bytesLoaded;

    }

    private function selectHandler( e:Event )
    {
        for (var i:uint = 0; i < file.fileList.length; i++)
        {
            file.fileList[i].upload(req);
        }
    }

    private function show_message( e:DataEvent )
    {
        tm.stop();
        var tf = new TextFormat();
        if (e.data == 'ok')
        {
            tf.color = 0x009900;
            label_txt.defaultTextFormat = tf;
            label_txt.text = 'The file has been uploaded.';
        }
        else if ( e.data == 'error')
        {
            tf.color = 0xff0000;
            label_txt.defaultTextFormat = tf;
            label_txt.text = 'The file could not be uploaded.';
        }
    }

    private function updateSpeed( e:TimerEvent )
    {
        speed = Math.round( (currbytes - lastbytes)/1024 );
        lastbytes = currbytes;
    }

    private function cancelUpload( e:MouseEvent )
    {
        file.cancel();
        reset();
    }

    private function reset()
    {
        cancel_btn.visible = false;
        select_btn.visible = true;
        label_txt.text = '';
        progress_mc.bar.scaleX = 0;
    }
   }
   }
4

0 回答 0