我正在尝试使用 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 ()
关于PHP/Actionscript 3 带有进度指示器的多个文件上传,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6170072/