在《Flex第一步》的第十五章中,有一节关于文件上传的内容,这其中存在一个严重的知识性错误,在此特别作说明。
文中提到:在上传文件时,当上传结束后无法获取服务器的返回信息。最近翻看AS3.0的官方文档,发现是可以实现的。
FileReference对象的uploadCompleteData 事件在上载成功且从服务器接收数据之后被派发。 如果没有返回数据,则不派发此事件。我们只要侦听FileReference的uploadCompleteData事件,就可以获取返回数据。
下面是一个具体的实例:
<p><mx:application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" fontsize="12" creationcomplete="init()" width="518" height="347"></p> <p> <mx:script> <!--[CDATA[</p> <p> import flash.net.FileReference; import flash.net.URLRequest; import flash.net.FileFilter; import flash.net.URLVariables;</p> <p> import flash.events.ProgressEvent;</p> <p> import mx.managers.CursorManager; // private var file:FileReference;</p> <p> internal function init():void{</p> <p> file = new FileReference(); file.addEventListener(Event.SELECT, onSelect); file.addEventListener(ProgressEvent.PROGRESS, processHandler); //侦听UPLOAD_COMPLETE_DATA事件 file.addEventListener(DataEvent.UPLOAD_COMPLETE_DATA,uploadDataHandler);</p> <p> }</p> <p> internal function doSelect():void{ var imageTypes:FileFilter = new FileFilter("Images (*.jpg, *.jpeg, *.png)", "*.jpg;*.jpeg;*.png"); var allTypes:Array = new Array(imageTypes); file.browse(allTypes); } internal function onSelect(evt:Event):void{ pic_txt.text = file.name; } internal function doUpload():void{ var request:URLRequest = new URLRequest("upload.php");</p> <p> file.upload(request); CursorManager.setBusyCursor(); } internal function processHandler(evt:ProgressEvent):void{ // //evt.bytesTotal; } internal function uploadDataHandler(evt:DataEvent):void{ CursorManager.removeBusyCursor(); //获取返回数据,也就是上传后的图片地址,显示出来 img.source = evt.data.toString(); } ]]--> </mx:script></p> <p> <mx:image id="img" width="377" height="108" x="10" y="59"> <mx:textinput id="pic_txt" width="150" x="109" y="10"> <mx:button label="选择文件" click="doSelect()" x="10" y="10"> <mx:button label="开始上传" click="doUpload()" x="295" y="10"></p> <p></mx:button> </mx:button></mx:textinput></mx:image></mx:application>
upload.php的代码如下:
//$imgName = $_GET['filename'];</p> <p> $file = $_FILES["Filedata"]["tmp_name"]; </p> <p> $oldName = $_FILES["Filedata"]["name"]; </p> <p> $ext = substr($oldName, strrpos($oldName, ".")); </p> <p> $newName = "pics/".date("YmdHis").$ext;</p> <p> $result = move_uploaded_file($file, $newName); </p> <p> if($result){ echo $newName; }else{ echo "error"; } ?>
点击看运行的例子:http://www.fluidea.cn/book/uploadEx/FlexUpload.html 右键选择”View Source“可以下载源代码。