AIR文件上傳與文件斷點續傳方式下載

 
<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
					   xmlns:s="library://ns.adobe.com/flex/spark" 
					   xmlns:mx="library://ns.adobe.com/flex/mx"
					   creationComplete="init()" >
	<fx:Script>
		<![CDATA[
			import mx.controls.Alert;
			private var _uploadURLRequest:URLRequest;
			private var _fileRef:FileReference;
 
			private function init():void{
				_uploadURLRequest = new URLRequest();
				_uploadURLRequest.url = "http://localhost/upload/uploadPHP.php";
				_fileRef = new FileReference();
				configureListeners(_fileRef);
			}
			private function configureListeners(dispatcher:IEventDispatcher):void{
				dispatcher.addEventListener(Event.SELECT,onSelect);
				dispatcher.addEventListener(ProgressEvent.PROGRESS,onProgress);
				dispatcher.addEventListener(Event.COMPLETE,onComplete);
				//dispatcher.addEventListener(DataEvent.UPLOAD_COMPLETE_DATA,onUploadComplete);
			}
			private function onSelect(event:Event):void{
				_fileRef = FileReference(event.target);
				uploadBtn.enabled = true;
				picSrc.text = _fileRef.name;
			}
			private function doSelect():void{
				var fileFilter:FileFilter = new FileFilter("Images(*.jpg,*.jpeg,*.gif,*.png)",
					"*.jpg;*.jpeg;*.gif;*.png");
				var allTypes:Array = new Array(fileFilter);
				_fileRef.browse(allTypes);
			}
			private function doUpload():void{
 				var variables:URLVariables = new URLVariables();
				variables.username= "ddonng";
				variables.filename = "user_name" + "_"+ new Date().time;
				variables.extension = _fileRef.extension;
				_uploadURLRequest.method = URLRequestMethod.POST; 				
				_uploadURLRequest.data = variables;
 
				_fileRef.upload(_uploadURLRequest);
				progressBar.visible = true;
			}
			private function onProgress(event:ProgressEvent):void{
				progressBar.setProgress(event.bytesLoaded/event.bytesTotal*100,100);
				progressBar.label = "當前進度" + (event.bytesLoaded/event.bytesTotal*100) + "%";
			}
			private function onComplete(event:Event):void{
				Alert.show("圖片上傳成功!","TIP");
				uploadBtn.enabled =  false;
			}
		]]>
	</fx:Script>
	<fx:Declarations>
		<!-- Place non-visual elements (e.g., services, value objects) here -->
	</fx:Declarations>
	<s:VGroup>
		<s:TextInput id="picSrc" />
		<s:Button id="browseBtn" label="瀏覽圖片" click="doSelect()"/>
		<s:Button id="uploadBtn" label="上傳文件" click="doUpload()" enabled="false"/>
		<mx:ProgressBar id="progressBar" minimum="0" maximum="100" 
						label="當前進度 0%" visible="false" mode="manual"/>
 
	</s:VGroup>
</s:WindowedApplication>
 
 
 
 
 

<?xml version="1.0" encoding="utf-8"?> <s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" creationComplete="init();" > <fx:Script> <![CDATA[ import flash.net.URLLoader; import flash.net.URLLoaderDataFormat; import flash.net.URLRequest; import flash.utils.ByteArray;   import mx.controls.Alert; [Bindable] private var progress:Number = 0; private var contentLength:int = 0; private var fileDir:File; private var file:File; private var startPoint:int = 0; private var endPoint:int = 0; private var rangeLoader:URLLoader;   private var range:int = 50000;   [Bindable] private var downloadStatus:Boolean = false;   private function init():void { var dotSplitLength:uint = videoURL.text.split("/").length;//這兩行代碼是爲了獲取下載文件的名稱 var fileName:String = videoURL.text.split("/")[dotSplitLength-1]; var username:String = "iove86";//如果多用戶,則這裏取出用戶名來建目錄(我需要的功能) var downloadDir:String = "F:/myfiles/"+username+"/"; fileDir = new File(downloadDir);//File可以是文件也可以是目錄,但是要用來創建目錄時,顯然不能爲文件 try{ fileDir.createDirectory(); }catch(err:Error){ Alert.show("文件建立發生錯誤!","MSG"); } file = new File(downloadDir+fileName);//創建一個和下載文件名稱一致的文件,保存在D盤temp目錄下 }   private function doDownload():void {//先發送一個下載請求,可以得到文件的真實尺寸 var getContentLengthRequest:URLRequest = new URLRequest(videoURL.text); var getContentLengthLoader:URLLoader = new URLLoader(); getContentLengthLoader.addEventListener(ProgressEvent.PROGRESS ,function(e:ProgressEvent):void { contentLength = getContentLengthLoader.bytesTotal;//得到文件的真實尺寸 getContentLengthLoader.close();//停止下載 downloadByRange();//按照斷點續傳的方式下載 }); getContentLengthLoader.load(getContentLengthRequest); }   private function downloadByRange():void {//按照斷點續傳的方式下載 downloadStatus = true; var fileStr:FileStream = new FileStream(); if(file.exists) {//如果文件是存在的,就說明下載過,需要計算從哪個點開始下載 fileStr.open(file, FileMode.READ); startPoint = fileStr.bytesAvailable;//計算從哪個點開始下載 fileStr.close();//關閉文件流 } trace("start:"+startPoint); if(startPoint+range > contentLength) {//確定下載的區間範圍,比如0-10000 endPoint = contentLength; } else { endPoint = startPoint+range; } var rangeRequest:URLRequest = new URLRequest(videoURL.text); var header:URLRequestHeader = new URLRequestHeader("Range", "bytes="+startPoint+"-"+endPoint);//注意這裏很關鍵,我們在請求的Header裏包含對Range的描述,這樣服務器會返回文件的某個部分 rangeRequest.requestHeaders.push(header);//將頭信息添加到請求裏 rangeLoader = new URLLoader(); rangeLoader.dataFormat = URLLoaderDataFormat.BINARY;//設置數據類型爲字節 rangeLoader.addEventListener(Event.COMPLETE ,function(e:Event):void { var currentData:ByteArray = rangeLoader.data;//得到下載的數據 fileStr = new FileStream(); fileStr.open(file, FileMode.UPDATE); fileStr.position = fileStr.bytesAvailable;//將指針指向文件尾 fileStr.writeBytes(currentData, 0, currentData.length);//在文件中寫入新下載的數據 fileStr.close();//關閉文件流 progress = endPoint/contentLength * 100;//計算下載進程 if(progress < 100) { downloadByRange();//如果下載沒有完成,則執行下一個斷點下載,直到下載完畢整個文件 } }); rangeLoader.load(rangeRequest);//發起請求 }   private function pause():void {//暫停下載 downloadStatus = false; rangeLoader.close(); }   private function open():void { file.openWithDefaultApplication(); } ]]> </fx:Script> <fx:Declarations> <!-- Place non-visual elements (e.g., services, value objects) here --> </fx:Declarations> <mx:Form x="29" y="26" width="50%" height="309"> <mx:FormItem label="URL"> <mx:TextInput id="videoURL" width="253" text="http://levis.ogilvy.com.cn/hk/media/background.mp3"/> </mx:FormItem> <mx:FormItem label="進度"> <mx:Label text="{progress+'%'}"/> </mx:FormItem> <mx:FormItem label="Label"> <mx:Button label="下載" click="doDownload();btDownload.visible=false" id="btDownload"/> </mx:FormItem> <mx:FormItem label="Label"> <mx:Button label="暫停" visible="{downloadStatus}" click="pause()"/> <mx:Button label="繼續" visible="{!downloadStatus}" click="downloadByRange()"/> <mx:Button label="打開" visible="{progress==100}" click="open()"/> </mx:FormItem> </mx:Form> </s:WindowedApplication>

 

 

來自:http://iove86.sinaapp.com/adobe-air/air-upload-and-download-file.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章