Flex上傳多文件,並實現預覽的效果

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
			   xmlns:s="library://ns.adobe.com/flex/spark" 
			   xmlns:mx="library://ns.adobe.com/flex/mx" width="645" height="600"  xmlns:net="flash.net.*" initialize="initEvent(event)" creationComplete="creationCompleteEvent(event)">
	<fx:Declarations>
		<!-- 將非可視元素(例如服務、值對象)放在此處 -->
		<net:FileReferenceList id="fileReferenceList"
							   select="fileReference_select(event);"/>
		<mx:NumberFormatter id="filesizeFormatter" useThousandsSeparator="true"/> 
	</fx:Declarations>
	<fx:Script>
		<![CDATA[
		import mx.collections.ArrayCollection;
		import mx.controls.Alert;
		import mx.formatters.CurrencyFormatter;
		import mx.formatters.NumberFormatter;
		import mx.controls.ProgressBar;
		
		private var FileDesc:String="Images"; 
		private var Extension:String="*.jpg;*gif;*.png"; 
		private var Url:String="http://localhost:8666/Ashx/FileHandler.ashx";
		private var FileFolder:String=""; 
			
		private var urlrequest: URLRequest = new URLRequest(Url);  
		private var singleThreadFiles: Array = [];  
			
		[Bindable]
		private var arrColl:ArrayCollection = new ArrayCollection();
		
		private function initEvent(e:Event):void
		{
			var sdsd:String="abc";
			//var aa:Boolean=typeof(root.loaderInfo.parameters["fileDesc"])=="undefined";
		}
			
		private function creationCompleteEvent(e:Event):void
		{
			//var aa:Boolean=typeof(LoaderInfo(this.root.loaderInfo).parameters["fileDesc"])=="undefined";
		}
			
		private function btn_click(evt:MouseEvent):void
		{
			if(typeof(root.loaderInfo.parameters["fileDesc"])!="undefined")
			{
				FileDesc=root.loaderInfo.parameters["fileDesc"];
			}
			if(typeof(root.loaderInfo.parameters["Extension"])!="undefined")
			{
				Extension=root.loaderInfo.parameters["Extension"];
			}
			var arr:Array = [];
			arr.push(new FileFilter(FileDesc, Extension));

			fileReferenceList.browse(arr);
		}
		
		private function fileReference_select(evt:Event):void
		{
			for (var i:int = 0; i < fileReferenceList.fileList.length; i++)
			{
				fileReferenceList.fileList[i].addEventListener(Event.COMPLETE, completeLoadFile);
				fileReferenceList.fileList[i].load();
			}
		}
		
		private function completeLoadFile(e:Event):void
		{
			var loader:Loader = new Loader();
			var file:FileReference = e.target as FileReference;
			if(file.size>1024*1024*4)
			{
				Alert.show("文件不能超過4M.","錯誤");
				return;
			}
			loader.contentLoaderInfo.addEventListener(Event.COMPLETE, function():void
			{
				var bmp:Bitmap=loader.content as Bitmap;
				var bmd:BitmapData;
				if((bmp.width>bmp.height||bmp.width==bmp.height)&&bmp.width>800)
				{
					var rateW:Number=800/bmp.width;
					var h:Number=rateW*bmp.height;
					bmd=new BitmapData(800,h,true,0);
					bmd.draw(bmp.bitmapData,new Matrix(rateW,0,0,rateW),null,null,null,true);
					bmp=new Bitmap(bmd,"auto",true);
				}
				else if(bmp.height>bmp.width&&bmp.height>800)
				{
					var rateH:Number=800/bmp.height;
					var w:Number=rateH*bmp.width;
					bmd=new BitmapData(w,800,true,0);
					bmd.draw(bmp.bitmapData,new Matrix(rateH,0,0,rateH),null,null,null,true);
					bmp=new Bitmap(bmd,"auto",true);
				}
				var f:FileReference = e.target as FileReference;
				f.removeEventListener(Event.COMPLETE, completeLoadFile);
				arrColl.addItem({img:bmp,file:e.target});
				
				
			});
			loader.loadBytes(e.target.data);
			
		
		}
			
			public function removeFile(data:Object): void  
			{  
				var index: int = arrColl.getItemIndex(data); 
				if (index != -1)  
					arrColl.removeItemAt(index);  
			}  
			
			private function uploadFile(): void  
			{                 
				for each (var obj:Object in arrColl)  
				{             
					try  
					{  
						var f:FileReference = obj.file;
						f.upload(urlrequest);  
					}  
					catch (e: Error)  
					{  
						Alert.show(e.message);  
					}  
				}                 
			}  
			
			private function uploadFileOneByOne():void
			{	
				if(typeof(root.loaderInfo.parameters["Url"])!="undefined")
				{
					urlrequest.url=root.loaderInfo.parameters["Url"];
				}
				if(typeof(root.loaderInfo.parameters["FileFolder"])!="undefined")
				{
					FileFolder=root.loaderInfo.parameters["FileFolder"];
				}
				if(urlrequest.url==null || urlrequest.url=="")
				{
					Alert.show("請求的地址不能爲空.","錯誤");
					return;
				}
			
				var variables:URLVariables = new URLVariables();
				variables.folder = FileFolder;
				urlrequest.data=variables;
				
				for each (var obj:Object in arrColl)  
				{
					singleThreadFiles.push(obj.file);
				}
				singleThreadFiles.reverse();
				singleThreadUploadFile(); 
				
			}
			
			private function singleThreadUploadFile(): void  
			{  
				//FIFO:逐個從列表中取出,進行同步上傳  
				if (singleThreadFiles.length > 0)  
				{  
					var f: FileReference = singleThreadFiles.pop() as FileReference;  
					f.addEventListener(DataEvent.UPLOAD_COMPLETE_DATA, doSingleUploadFileComplete);  
					f.upload(urlrequest);  
					
					
				}  
			}  
			private function doSingleUploadFileComplete(event: Event): void  
			{  
				var f: FileReference = event.target as FileReference;  
				f.removeEventListener(DataEvent.UPLOAD_COMPLETE_DATA, doSingleUploadFileComplete);  
				arrColl.removeItemAt(0);
				ExternalInterface.call("onUploaderComplete", f.name);  // 每上傳完一個文件後調用js函數onUploaderComplete   
				singleThreadUploadFile();  
			} 
			
			private function RemoveAllFiles(event:Event):void
			{
				arrColl.removeAll();
			}
		]]>
	</fx:Script>
	
	
	
	
	<mx:Panel id="panel"
			  layout="vertical"
			  horizontalCenter="0"
			  verticalCenter="0"
			  width="645"
			  height="600" headerHeight="0">
		<mx:HBox>
		<mx:Button label="瀏覽"
				   click="btn_click(event);"
				   width="73"
				   height="34"
				   fontSize="12"
				  />
		<mx:Button label="上傳"  width="73"
				   height="34" fontSize="12"> 
			<mx:click> 
				<![CDATA[  
				uploadFileOneByOne();  
				]]> 
			</mx:click> 
		</mx:Button> 
		<mx:Button label="全部刪除" width="73" height="34" fontSize="12" click="RemoveAllFiles(event);">
			
		</mx:Button>
		<mx:Label text="已選擇{arrColl.length}個文件,一次限上傳15個文件" color="Red">
			
		</mx:Label>
		</mx:HBox>
		<mx:TileList id="tileList"
					 dataProvider="{arrColl}"
					 width="640"
					 height="520"
					 verticalScrollPolicy="off"
					 dragEnabled="false" 
					 x="0"
					 y="19">
			<mx:itemRenderer>
				<fx:Component>
					<mx:VBox backgroundColor="#23423D">
						
						<mx:LinkButton label="×" accentColor="#cdddf3"> 
							<mx:click> 
								<![CDATA[  
								outerDocument.removeFile(data);  
								]]> 
							</mx:click> 
						</mx:LinkButton>
						<mx:Image width="120" height="100" source="{data.img}"/>
						<fx:Script> 
							<![CDATA[  
								import flash.profiler.showRedrawRegions;
								
								import mx.controls.Alert;
								import mx.controls.ProgressBar;  
								private function initProgressBar(event: Event): void  
								{  
									//使progressbar與file關聯,從而產生進度條  
									var pb: ProgressBar = event.target as ProgressBar;  
									pb.label = "0%";  
									pb.setProgress(0, 100);  
									var f: FileReference = data.file as FileReference;
									
								//	f.addEventListener(ProgressEvent.PROGRESS,onProcessHandler);
									//使用閉包方法,更新進度條  
									f.addEventListener(ProgressEvent.PROGRESS,  
										function(event: ProgressEvent): void  
										{  
											pb.setProgress(event.bytesLoaded, event.bytesTotal);  
										}  
									);  
									f.addEventListener(DataEvent.UPLOAD_COMPLETE_DATA,  
										function (event: DataEvent): void  
										{  
											//服務器端一定要返回數據,否則,這個方法就不起作用了  
											//pb.label = event.data;  
											pb.setProgress(0,100);
										}  
									);                                             
								}  
							]]> 
						</fx:Script> 
						<mx:ProgressBar verticalCenter="true" width="120" paddingLeft="0" paddingRight="0" 
										maximum="100" minimum="0" labelPlacement="center" mode="manual" 
										label="0%" textAlign="left"  
										creationComplete="initProgressBar(event)"/> 
					</mx:VBox>
				</fx:Component>
			</mx:itemRenderer>
		</mx:TileList>
	
	</mx:Panel>
</s:Application>

發佈了34 篇原創文章 · 獲贊 1 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章