我想上传多个文件。我在 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;
}
}
}