こんにちは。
プロダクト&サービス事業部 リーダーの末田です。
今回は、AIR/Flex でファイルのアップロード(HTTPのPOST)について書こうと思います。
ファイルアップロードにおけるAIR/FlexとINPUTタグの違い
ファイルのアップロード自体は、わざわざAIR/Flexで行わなくても、HTMLのINPUTタグで可能ですが、AIR/Flexで行うと以下のような利点があります。
- ブラウザが固まらない
- アップロードの進捗が見えやすい
- ドラッグアンドドロップ等でファイルを選択できる(AIRのみ)
INPUTタグによるファイルアップロードの場合、
アップロードを行っている間、ブラウザは無反応になります。
大きなファイルをアップロードしている場合、特に顕著に発生します。
その時にブラウザ内をクリックするとOSから「応答なし」という判断になることもあります。
AIR/Flexでは、そのようなことは起きません。
また、アップロード中に他の操作を受け付けることもできます。
INPUTタグによるファイルアップロードの場合、
アップロードの進捗は見えない、もしくはプログレスバーが動いてはいるが、よくわからない、といった表示になります。
Ajaxを利用して、自作のプログレスバーを表示することもできますが、
クライアント側、サーバ側それぞれに仕組みが必要になります。
AIR/Flexでは、アップロードの進捗をイベントとして受け取ることができるので、クライアント側だけで、自作のプログレスバーを表示することができます。
INPUTタグによるファイルアップロードの場合、
アップロードするファイルを指定する方法は、標準のファイル選択ダイアログのみとなりますが、AIRでは、ファイルパスの指定方法は限定されません。
Flexでは、標準のファイル選択ダイアログのみとなります。
基本的なファイルアップロード
AIR/Flexの場合
AIR/Flexでの基本的なファイルアップロードのサンプルコードです。
以下のように動作します。
- ボタンをクリックすると、
- ファイル参照ダイアログが開き、
- ファイルを選択してOKをクリックすると、
- ファイルがアップロードされます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | <?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="300" height="200"> <mx:Script> <![CDATA[ private function onClickBtn1 () : void { //ファイル参照オブジェクトを準備します var file:FileReference = new FileReference(); //ファイル参照ダイアログで、ファイルが選択された場合に発生するイベント file.addEventListener(Event.SELECT, function (event:Event):void { //アップロードするURLを指定します var req:URLRequest = new URLRequest("http://localhost:8080/blogsample/upload.ctrl"); req.method = URLRequestMethod.POST; //アップロード終了イベント file.addEventListener(Event.COMPLETE, function (event:Event):void{ trace("complete"); }); //アップロード実行 file.upload(req, "file1"); }); //ファイル参照ダイアログを開く file.browse(); } ]]> </mx:Script> <mx:Button id="btn1" x="100" y="90" width="100" height="20" label="UPLOAD" click="onClickBtn1()"/> </mx:Application> |
Flexでは、flash.net.FileReference クラスを使います。
このクラスだけで、ファイルの選択(ダイアログ表示)とアップロードを行うことができます。
AIRの場合
AIR上では、このクラスだけでなく、flash.filesystem.Fileクラスも利用することができます。
このクラスではファイルパスを指定できるので、ファイル参照ダイアログを開かなくても、アップロードするファイルを指定できます。
これにより、ドラッグアンドドロップ等、様々な方法でアップロードするファイルを指定できます。
AIR上でflash.filesystem.Fileクラスを使用した場合のサンプルです。
以下のように動作します。
- ボタンをクリックすると、
- ファイルがアップロードされます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | <?xml version="1.0" encoding="utf-8"?> <mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="300" height="200"> <mx:Script> <![CDATA[ private function onClickBtn1 () : void { //ファイルオブジェクトを準備します var file:File = new File("c:\\uploadsample.txt"); //アップロードするURLを指定します var req:URLRequest = new URLRequest("http://localhost:8080/blogsample/upload.ctrl"); req.method = URLRequestMethod.POST; //アップロード終了イベント file.addEventListener(Event.COMPLETE, function (event:Event):void{ trace("complete"); }); //アップロード実行 file.upload(req, "file1"); } ]]> </mx:Script> <mx:Button id="btn1" x="100" y="90" width="100" height="20" label="UPLOAD" click="onClickBtn1()"/> </mx:WindowedApplication> |
アップロード時のパラメータ
ファイルのアップロード時、一緒にリクエストパラメータを送信する場合は、
flash.net.URLVariablesクラスを使用します。
URLVariablesクラスに、リクエストパラメータのキー名をプロパティ名、値をプロパティの値として設定し、URLRequestクラスのdataプロパティに設定することにより、送信できます。
1 2 3 4 | var req = new URLRequest(); var param:URLVariables = new URLVariables(); param.hogekey="hogevalue"; req.data = param; |
アップロードの進捗の取得
アップロードの進捗度合いは、flash.net.FileReference クラスもしくは、flash.filesystem.Fileクラスのflash.events.ProgressEventから、全体のバイト数(bytesTotal)と現在アップロードしたバイト数(bytesLoaded)を取得できます。
1 2 3 4 | file.addEventListener(ProgressEvent.PROGRESS, function (event:ProgressEvent):void { trace("bytesTotal=" + event.bytesTotal); trace("bytesLoaded=" + event.bytesLoaded); }); |
まとめ
以上で、ファイルアップロードに関しては一通り行えると思います。
これを利用して、詳細なプログレスバーが出る、
HTMLでは実現が難しいようなアップローダー等が実現できます。
INPUTタグでのアップロードでは、大きなファイルになればなるほど、
問題が大きく、インタフェースとして使いにくいものですので、
ぜひ活用していきたく思っています。
使用したソフトウェア
| バージョン | |
|---|---|
| Adobe AIR | 1.5 |
| Adobe Flex SDK | 3.2.0 |





6月 26th, 2009 at 10:55
[...] AIR/Flex でファイルアップロード (1) [...]
6月 26th, 2009 at 10:57
[...] AIR/Flex でファイルアップロード (1) [...]
10月 21st, 2009 at 19:02
[...] AIR/Flexでアップロード [...]