今度作成予定の Adobe AIR アプリに、Webサーバ上から特定のファイルを落としてくる機能をつけないといけないので、どんな方法があるか試してみようと思って、取りあえず URLLoader + URLRequest クラス利用で作ってみた。
「受信スタート」ボタンを押したら、Web サーバ上の画像ファイルを取得し、それを hoge.jpg という名前で書き出すだけのプログラム。
最初は HTTPService クラスを使った方がいいのかなと(だって名前がそのものずばりだから)色々やってみたのだが、どうも HTTPService クラスは Web サービス用?
データをどうしても ByteArray で取り出せないので諦めた。
XML や CSV などのテキストデータではうまくいったんだけどなあ。
で、取りあえず URLLoader + URLRequest クラスを利用してデータを取得するパターンのソースが↓こんな感じ。
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="274" height="120">
<mx:Script>
<![CDATA[import flash.events.Event;
import flash.net.URLLoader;
import flash.net.URLLoaderDataFormat;
import flash.net.URLRequest;
import flash.net.URLRequestHeader;
import flash.net.URLVariables;
import flash.utils.ByteArray;private function getHttp():void {
var req:URLRequest = new URLRequest();
req.url = "http://www.exsample.com/test/hoge.jpg";
req.userAgent = "Test Bot 1.0";var loader:URLLoader = new URLLoader();
loader.addEventListener(Event.COMPLETE,loadComp);
loader.dataFormat = URLLoaderDataFormat.BINARY;
loader.load(req);}
private function loadComp(event:Event):void{
var urlLoader:URLLoader = event.target as URLLoader;
var byte:ByteArray = urlLoader.data as ByteArray;var file:File = File.userDirectory.resolvePath("hoge.jpg");
var stream:FileStream = new FileStream();
stream.openAsync(file, FileMode.WRITE);
stream.writeBytes(byte, 0, byte.bytesAvailable);
stream.close();}
]]>
</mx:Script><mx:Button x="93.5" y="20" label="受信スタート" id="button1" click="getHttp();"/>
</mx:WindowedApplication>
最初、取得するデータの型を
loader.dataFormat = URLLoaderDataFormat.BINARY;
という具合に指定してなかったので(多分、ディフォルト値は'TEXT'?)、ハマってしまった。
いやあ、日頃、データ型の無い Perl を使うことが多いんでねえ。
バイナリだろうがテキストだろうが、生のデータを返してくるプロパティがあればいいのにな。
コメントする