首先申明,本人第一次写博客,不足之处还望大家见谅和不吝赐教,谢谢。
背景是这样的:由于项目需要,flex中实现批量导入多个文件(.txt,.dat,...),解析数据并保存到数据库中。
采用FileReferenceList 实现多个文件导入。自然用到filelist.browse()以及file.load()。由于load()加载还未完成,继续for循环,导致最后循环结束时,取到的file.data是最后一个元素的。下面先列出修改之前的代码:
private var file:FileReference = new FileReference(); private var filelist:FileReferenceList= new FileReferenceList(); private var filter:FileFilter = new FileFilter("请选择文件(*.dat)","*.dat"); private var filedatas:ArrayCollection = new ArrayCollection([]); protected function init(event:FlexEvent):void{ filelist.addEventListener(Event.SELECT, file_select); } /** * 选择excel文件 */ private function click_BrowseXLS(event:MouseEvent):void { filedatas.removeAll(); filelist.browse([filter]); } // 选择 文件,加载文件 private function file_select(e:Event):void{ for(var i:int=0;i<filelist.fileList.length;i++){ file = filelist.fileList[i]; file.load(); file.addEventListener(Event.COMPLETE,file_complete); } //调用保存方法 filelists_complete(); } protected function file_complete(e:Event):void{ var obj:Object= new Object(); obj.fileName = file.name; obj.fileSize = file.size; obj.fileType = file.type; obj.fileRefrence = file.data; filedatas.addItem(obj); } //保存方法 protected function filelists_complete():void{ //相关保存操作 };
在网上找了很久,解决方案都比较少,或者更多的是基于swf或者图片操作的。结合网上的一些帖子,最终觉得采用针对每一个文件,都新生成一个file对象,当所有的file都加载完成之后,再来执行我们的保存方法,具体代码如下:
private var filelist:FileReferenceList= new FileReferenceList(); private var filter:FileFilter = new FileFilter("请选择文件(*.dat)","*.dat"); private var filedatas:ArrayCollection = new ArrayCollection([]); private var s:int = 0;//用于判断文件是否全部加载(load)完 protected function init(event:FlexEvent):void{ filelist.addEventListener(Event.SELECT, file_select); } /** * 选择excel文件 */ private function click_BrowseXLS(event:MouseEvent):void { s = 0; filedatas.removeAll(); filelist.browse([filter]); } // 选择 文件,加载文件 private function file_select(e:Event):void{ for(var i:int=0;i<filelist.fileList.length;i++){ var file:FileReference = FileReference(filelist.fileList[i]); file.load(); file.addEventListener(Event.COMPLETE,file_complete); } //调用保存方法 filelists_complete(); } protected function file_complete(e:Event):void{ //被调用 filelist.fileList.length 次之后,即所有文件都加载完成之后,才调用加载数据的方法 s = s + 1; if(s == filelist.fileList.length){ for(var i:int=0;i<filelist.fileList.length;i++){ var f:FileReference = FileReference(filelist.fileList[i]); var obj:Object= new Object(); obj.fileName = f.name; obj.fileSize = f.size; obj.fileType = f.type; obj.fileRefrence = f.data; filedatas.addItem(obj); } } } //保存方法 protected function filelists_complete():void{ //相关保存操作 };
对比前后代码不难发现,其实我们就是在监听完成方法file_complete()里面,加上一个判断。如果选中了N个文件,如果该方法已经被调用了N,就意味着所有文件都已经load(加载)完成,然后我们再循环一次所有的文件,分别取到f.data,就能得到我们想要的数据,之后再执行我们的保存方法,该功能即可实现。之后将数据传到后台,至于怎么去解析数据,后面找机会再出心得。谢谢