FlexとPHPでダウンローダー



過去に作ったAirアプリをダブルクリックでダウンロードできます。


こんな感じ
ソース


最初、Flexだけで作ろうかと思ったのですが、ディレクトリ内のファイルの一覧の取得とかが出来ないので、PHPと連携させました。


まず、PHP

<?php
        $url = "http://www11.atpages.jp/matsu4512/air";
	$lst = "../../air"; // 表示するリストの名前

	header ("Content-Type: text/xml; charset=UTF-8");
	$drc=dir($lst);
	print("<result>");
	while($fl=$drc->read()) {
		//".",".."フォルダは表示しない
		if($fl == "." || $fl == ".." || is_dir($fl)) continue;
		print("<item>");
		$lfl = $lst."/".$fl;
		$din = pathinfo($lfl);
		//ファイル名
		print("<name>".$din["basename"]."</name>");
	    print("<url>".$url."/".$fl."</url>");
	    // ファイル更新日
	    print("<date>");
	    echo date("y/m/d",filemtime($lfl));
	    print("</date>");
	    // ファイルサイズ
	    print("<size>");
	    echo round(filesize($lfl)/1024)."KB";
	    print("</size>");
		print("</item>");
	}
	print("</result>");
	$drc->close();
?>


指定したディレクトリ内のファイル情報を取得してXML形式で表示しています。


Flex

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" initialize="init()" doubleClickEnabled="true" borderColor="#F8F8F8" backgroundGradientAlphas="[1.0, 1.0]" backgroundGradientColors="[#706DB8, #A16262]" width="485" height="396">
<mx:HTTPService id="service" url="./file_list.php" resultFormat="e4x" result="result(event)" fault="fault(event)"/>
	<mx:DataGrid id="file_dg" x="10" y="72" width="381" height="238" dataProvider="{data_ary}" doubleClick="download()">
		<mx:columns>
			<mx:DataGridColumn headerText="File Name" dataField="name"/>
			<mx:DataGridColumn headerText="Update" dataField="date" width="100"/>
			<mx:DataGridColumn headerText="Size" dataField="size" width="100"/>
		</mx:columns>
	</mx:DataGrid>
	<mx:ArrayCollection id="data_ary"/>
	<mx:ProgressBar x="10" y="10" width="381" minimum="0" maximum="100" id="prog" label="" mode="manual"/>
	<mx:Script>
		<![CDATA[
			import mx.rpc.events.FaultEvent;
			import mx.rpc.events.ResultEvent;
			private var fileRef:FileReference;
		
			private function init():void{
				fileRef = new FileReference();
				fileRef.addEventListener(ProgressEvent.PROGRESS, onDownloadProgress);
				service.send();
			}
			
			private function onDownloadProgress(event:ProgressEvent):void{
				prog.setProgress(event.bytesLoaded, event.bytesTotal);
				prog.label = "ダウンロード中" + int(prog.percentComplete) + "%";
				if(int(prog.percentComplete) == 100)
					prog.label = "ダウンロード完了";
			}
			
			private function result(event:ResultEvent):void{
				var xml:XML = new XML(service.lastResult);
				var i:uint = 0;
				for each(var obj:Object in xml..item){
					data_ary.addItemAt(obj, i);
					i++;
				}
			}
			
			private function fault(event:FaultEvent):void{
				trace("エラー");
			}
			
			private function download():void{
				fileRef.download(new URLRequest(file_dg.selectedItem.url), file_dg.selectedItem.name);
			}
		]]>
	</mx:Script>
	<mx:Label x="10" y="46" text="ダブルクリックでダウンロード" color="#FFFFFF"/>
</mx:Application>


受け取ったXMLのそれぞれの要素をArrayCollectionに入れて、DataGridに表示。
そして、ダブルクリックでダウンロードできるようにしています。
ダウンロード部分は


fileRef.download(new URLRequest(file_dg.selectedItem.url), file_dg.selectedItem.name);


これだけです。第一引数はファイルのある場所、第二引数は保存する名前。