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);
これだけです。第一引数はファイルのある場所、第二引数は保存する名前。