FileReference クラスについて
FileReference クラスについて
■ FileReference クラスについて
FileReference クラスは、ファイルに関する機能がまとまっています。
ブラウザ上で動作する場合、HTML と同等のセキュリティ制限があります。
ファイルのアップロード
ファイルのダウンロード
サーバー上のファイルを、ダウンロードする事ができます。
ローカルからファイルを読み込む
ローカルにファイルを保存する
任意のバイナリデータを、ファイルとして保存する事ができます。
■ File クラスについて
Adobe AIR では、File クラスを使用できます。
FileReference クラスを継承しています。
より高機能で、アプリケーションでの利用に最適です。
File クラスについては、こちらで解説しています。
■ FileReference オブジェクトを作成する
new 演算子を使って、FileReference クラスをインスタンス化します。
FileReference クラスは、ファイル1つ分に相当します。
new FileReference ( ) :FileReference
引数 | void | なし |
戻り値 | FileReference | 新しい FileReference オブジェクト |
FileReference オブジェクトを作成する
import flash.net.FileReference;
// FileReference オブジェクトを作成する
var file_reference:FileReference = new FileReference();
// 出力テスト
trace(file_reference);
■ FileReferenceList オブジェクトを作成する
new 演算子を使って、FileReferenceList クラスをインスタンス化します。
new FileReferenceList ( ) :FileReferenceList
引数 | void | なし |
戻り値 | FileReferenceList | 新しい FileReferenceList オブジェクト |
FileReferenceList オブジェクトを作成する
import flash.net.FileReferenceList;
// FileReferenceList オブジェクトを作成する
var file_reference_list:FileReferenceList = new FileReferenceList();
// 出力テスト
trace(file_reference_list);
ファイルを選択する
■1つのファイルを選択する
FileReference クラスの browse() メソッドを使用します。
このメソッドは、非同期実行です。
選択結果を取得するには、イベントを使用します。
FileReference.browse ( [typelist] ) :Boolean
第01引数(略可) | Array | ファイルフィルタのリストを指定 |
戻り値 | Boolean | ファイル選択ダイアログを開くのに成功したか |
■第01引数 (ファイルフィルタのリスト)
こちらで解説しています。
■戻り値
ファイル選択ダイアログを開くのに成功した場合、true が得られます。
開くのに失敗した場合、エラーが発生します。
2つ以上のファイル選択ダイアログを、同時に表示する事はできません。
第01引数の書式に間違いがある場合、失敗します。
■ダイアログのセキュリティについて
マウスやキーボードなどの押下操作中に限って、実行する事ができます。
■ダイアログの操作結果を取得する
以下のイベントを使用します。
定数 | 型 | 説明 |
SELECT | Event | ファイルを選択した場合に実行される |
CANCEL | Event | キャンセルした場合に実行される |
■使用例
1つのファイルを選択する
import flash.net.FileReference;
import flash.events.MouseEvent;
import flash.events.Event;
// ------------------------------------------------------------
// FileReference オブジェクトを作成する
// ------------------------------------------------------------
var file_reference:FileReference = new FileReference();
// ------------------------------------------------------------
// ファイルを選択した場合に実行されるイベント
// ------------------------------------------------------------
file_reference.addEventListener( Event.SELECT , function (e:Event):void{
// 出力テスト
trace( file_reference.name );
trace( file_reference.size );
trace( file_reference.type );
trace( file_reference.creationDate );
trace( file_reference.modificationDate );
trace( file_reference.creator );
});
// ------------------------------------------------------------
// キャンセルした場合に実行されるイベント
// ------------------------------------------------------------
file_reference.addEventListener( Event.CANCEL , function (e:Event):void{
trace("ファイル選択をキャンセルした");
});
// ------------------------------------------------------------
// マウスの左ボタンをクリックすると実行されるイベント
// ------------------------------------------------------------
stage.addEventListener( MouseEvent.MOUSE_DOWN , function (e:MouseEvent):void{
try{
// ------------------------------------------------------------
// ファイル選択ダイアログを開く
// ------------------------------------------------------------
var result:Boolean = file_reference.browse();
// 出力テスト
trace(result);
}catch(e:Error){
}
});
■複数のファイルを選択する
FileReferenceList クラスの browse() メソッドを使用します。
このメソッドは、非同期実行です。
選択結果を取得するには、イベントを使用します。
FileReferenceList.browse ( [typelist] ) :Boolean
第01引数(略可) | Array | ファイルフィルタのリストを指定 |
戻り値 | Boolean | ファイル選択ダイアログを開くのに成功したか |
■第01引数 (ファイルフィルタのリスト)
こちらで解説しています。
■戻り値
ファイル選択ダイアログを開くのに成功した場合、true が得られます。
開くのに失敗した場合、エラーが発生します。
2つ以上のファイル選択ダイアログを、同時に表示する事はできません。
第01引数の書式に間違いがある場合、失敗します。
■ダイアログのセキュリティについて
マウスやキーボードなどの押下操作中に限って、実行する事ができます。
■ダイアログの操作結果を取得する
以下のイベントを使用します。
定数 | 型 | 説明 |
SELECT | Event | ファイルを選択した場合に実行される |
CANCEL | Event | キャンセルした場合に実行される |
■選択したファイルのリストを取得する
fileList プロパティを使用します。配列が得られます。
中身は、FileReference オブジェクトです。
■使用例
複数のファイルを選択する
import flash.net.FileReference;
import flash.net.FileReferenceList;
import flash.events.MouseEvent;
import flash.events.Event;
// ------------------------------------------------------------
// FileReferenceList オブジェクトを作成する
// ------------------------------------------------------------
var file_reference_list:FileReferenceList = new FileReferenceList();
// ------------------------------------------------------------
// ファイルを選択した場合に実行されるイベント
// ------------------------------------------------------------
file_reference_list.addEventListener( Event.SELECT , function (e:Event):void{
// 選択したファイルのリストを取得する
var file_list:Array = file_reference_list.fileList;
// 総数
var num:Number = file_list.length;
var i:Number;
for(i=0;i < num;i++){
// FileReference オブジェクトを取得
var file_reference:FileReference = file_list[i];
// 出力テスト
trace( file_reference.name );
trace( file_reference.size );
trace( file_reference.type );
trace( file_reference.creationDate );
trace( file_reference.modificationDate );
trace( file_reference.creator );
}
});
// ------------------------------------------------------------
// キャンセルした場合に実行されるイベント
// ------------------------------------------------------------
file_reference_list.addEventListener( Event.CANCEL , function (e:Event):void{
trace("ファイル選択をキャンセルした");
});
// ------------------------------------------------------------
// マウスの左ボタンをクリックすると実行されるイベント
// ------------------------------------------------------------
stage.addEventListener( MouseEvent.MOUSE_DOWN , function (e:MouseEvent):void{
try{
// ------------------------------------------------------------
// ファイル選択ダイアログを開く(複数選択)
// ------------------------------------------------------------
var result:Boolean = file_reference_list.browse();
// 出力テスト
trace(result);
}catch(e:Error){
}
});
■ファイル情報を取得する
ファイルを選択すると、以下のプロパティからファイル情報が得られます。
ファイルの中身を読み取る方法については、こちらで解説しています。
プロパティ名 | 型 | 説明 |
name | String | ファイル名 |
size | Number | サイズ |
type | String | ファイル形式 |
creationDate | Date | 作成日 |
modificationDate | Date | 最終更新日 |
creator | String | クリエータタイプ(Macintosh) |
■ファイル選択のフィルタについて
■ FileFilter オブジェクトを作成する
new 演算子を使って、FileFilter クラスをインスタンス化します。
new FileFilter ( description , extension , macType ) :FileFilter
第01引数 | String | description プロパティと同等 |
第02引数 | String | extension プロパティと同等 |
第03引数(略可) | String | macType プロパティと同等 |
戻り値 | FileFilter | 新しい FileFilter オブジェクト |
■プロパティについて
プロパティ名 | 型 | 説明 |
description | String | 説明文 |
extension | String | 拡張子のリスト。『 *.拡張子 』と記述。 複数記述する場合はセミコロン ; で挟む |
macType | String | Macintosh ファイルタイプのリスト(省略可能) 複数記述する場合はセミコロン ; で挟む |
■使用例
フィルタを指定して、ファイル選択ダイアログを開く
import flash.net.FileReference;
import flash.net.FileFilter;
// ------------------------------------------------------------
// FileReference オブジェクトを作成する
// ------------------------------------------------------------
var file_reference:FileReference = new FileReference();
// ------------------------------------------------------------
// ファイルフィルタリスト用のオブジェクトを作成する
// ------------------------------------------------------------
var file_filter_list:Array = new Array();
// ------------------------------------------------------------
// FileFilter オブジェクトを作成する
// ------------------------------------------------------------
var file_filter0:FileFilter = new FileFilter( "画像ファイル" , "*.bmp;*.gif;*.jpg;*.png" );
var file_filter1:FileFilter = new FileFilter( "サウンドファイル" , "*.wav;*.mp3" );
var file_filter2:FileFilter = new FileFilter( "動画ファイル" , "*.avi;*.mp4;*.flv" );
// ------------------------------------------------------------
// リストに FileFilter を追加する
// ------------------------------------------------------------
file_filter_list.push(file_filter0);
file_filter_list.push(file_filter1);
file_filter_list.push(file_filter2);
// ------------------------------------------------------------
// ファイル選択ダイアログを開く
// ------------------------------------------------------------
file_reference.browse( file_filter_list );
ファイルをアップロードする
■アップロードの仕様について
リクエストの形式について
リクエストのメソッドは、POST となります。
リクエストのコンテンツタイプは、multipart/form-data 形式です。
送信データについて
1度に、複数のファイルを送信する事はできません。
ファイルの送信と同時に、任意のデータも送信できます。
レスポンスについて
レスポンスボディを受信できます。結果は、String 型で得られます。
VARIABLES 形式に変換したい場合、URLVariables クラスを使用します。
Adobe AIR では、さらにレスポンスヘッダの取得も可能です。
サーバー側(CGI)の実装について
■送信データを指定する
URLRequest クラスを使用します。
明示的に、POST メソッドを指定します。
省略すると、GET メソッドに変化し、アップロードに失敗する場合があります。
リクエストのコンテンツタイプを変更する事はできません。
multipart/form-data 形式で送信されます。
送信データを指定する
import flash.net.URLRequest;
import flash.net.URLRequestMethod;
import flash.net.URLVariables;
// ------------------------------------------------------------
// URLRequest オブジェクトを作成する
// ------------------------------------------------------------
var url_request:URLRequest = new URLRequest();
// ------------------------------------------------------------
// 「HTTP メソッド」を設定する
// ------------------------------------------------------------
url_request.method = URLRequestMethod.POST;
// ------------------------------------------------------------
// URLVariables オブジェクトを作成する
// ------------------------------------------------------------
var url_variables:URLVariables = new URLVariables();
// ------------------------------------------------------------
// 「名前と値情報」を追加する
// ------------------------------------------------------------
url_variables["user"] = "taro";
url_variables["age"] = "18";
url_variables["blood"] = "b";
// ------------------------------------------------------------
// 送信データを指定する
// ------------------------------------------------------------
url_request.data = url_variables;
// 出力テスト
trace(url_variables.toString()); // "user=taro&age=18&blood=b"
■アップロードを開始する
1.ファイルを選択する
こちらで解説しています。
アップロードできるのは、ユーザーが選択(許可)したファイルのみです。
2.アップロードを開始する
upload() メソッドを使用します。
アップロードの開始に失敗した場合、エラーが発生します。
FileReference.upload ( request , uploadDataFieldName , testUpload ) :void
第01引数 | URLRequest | URLRequest オブジェクトを指定 |
第02引数(略可) | String | ファイルの name 属性の値を指定。デフォルトは、"Filedata" |
第03引数(略可) | Boolean | 事前にファイルサイズ 0 の HTTP 通信を試みるか?デフォルトは false |
戻り値 | void | なし |
■第01引数 (URLRequest)
リクエストに関する設定を行います。
URLRequest クラスについては、こちらで解説しています。
追加の送信データを含める方法については、こちらで解説しています。
■ブラウザを使って通信内容を確認する
ブラウザの開発者向けツールを使用すると、通信内容を確認する事ができます。
使用方法は、こちらで解説しています。
■アップロード結果を取得する
■ HTTP 通信の進捗状況を取得する
HTTP_RESPONSE_STATUS イベントは、Adobe AIR のみです。
定数 | 型 | 説明 |
OPEN | Event | (1) HTTP 通信を開始した |
PROGRESS | ProgressEvent | (2) リクエストボディを送信中 |
HTTP_RESPONSE_STATUS | HTTPStatusEvent | (3) レスポンスヘッダの受信が完了した |
HTTP_STATUS | HTTPStatusEvent | (3) レスポンスヘッダの受信が完了した (リクエストが失敗した場合のみ) |
UPLOAD_COMPLETE_DATA | DataEvent | (4) レスポンスボディの受信が完了した |
■ HTTP 通信の完了を取得する
以下の3つのイベントは、同時に発行されることはありません。
よって1つでも欠けている場合、通信の完了を取りこぼします。
定数 | 型 | 説明 |
COMPLETE | Event | アップロード成功(リクエストも成功) |
IO_ERROR | IOErrorEvent | アップロード失敗 |
SECURITY_ERROR | SecurityErrorEvent | アップロード失敗(原因はセキュリティ) |
■使用例
ファイルを送信し、結果を取得する
import flash.net.FileReference;
import flash.net.URLRequest;
import flash.net.URLRequestHeader;
import flash.net.URLRequestMethod;
import flash.net.URLVariables;
import flash.text.TextField;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.events.DataEvent;
import flash.events.ProgressEvent;
import flash.events.HTTPStatusEvent;
import flash.events.IOErrorEvent;
import flash.events.SecurityErrorEvent;
// ------------------------------------------------------------
// テキストフィールドを作成
// ------------------------------------------------------------
var text_field:TextField = new TextField();
// 位置とサイズ
text_field.x = 10;
text_field.y = 10;
text_field.width = stage.stageWidth - 20;
text_field.height = stage.stageHeight - 20;
// 枠線を表示
text_field.border = true;
// ステージに配置
stage.addChild(text_field);
// ------------------------------------------------------------
// FileReference オブジェクトを作成する
// ------------------------------------------------------------
var file_reference:FileReference = new FileReference();
// ------------------------------------------------------------
// ファイルを選択した場合に実行されるイベント
// ------------------------------------------------------------
file_reference.addEventListener( Event.SELECT , function (e:Event):void{
// ------------------------------------------------------------
// URLRequest オブジェクトを作成する
// ------------------------------------------------------------
var url_request:URLRequest = new URLRequest("http://example.com/cgi-bin/upload.cgi");
// ------------------------------------------------------------
// 「HTTP メソッド」を設定する
// ------------------------------------------------------------
url_request.method = URLRequestMethod.POST;
// ------------------------------------------------------------
// 追加の送信データを指定する
// ------------------------------------------------------------
// URLVariables オブジェクトを作成する
var url_variables:URLVariables = new URLVariables();
// 「名前と値情報」を追加する
url_variables["user"] = "taro";
url_variables["age"] = "18";
url_variables["blood"] = "b";
// 送信データを指定する
url_request.data = url_variables;
try{
// ------------------------------------------------------------
// アップロードを開始する
// ------------------------------------------------------------
file_reference.upload( url_request );
text_field.text = "アップロード開始 (result:" + (true) + ")\n" + text_field.text;
}catch(e:Error){
text_field.text = "アップロード開始 (result:" + (false) + " message:" + (e) + ")\n" + text_field.text;
}
});
// ------------------------------------------------------------
// キャンセルした場合に実行されるイベント
// ------------------------------------------------------------
file_reference.addEventListener( Event.CANCEL , function (e:Event):void{
text_field.text = "ファイル選択をキャンセルした\n" + text_field.text;
});
// ------------------------------------------------------------
// HTTP 通信を開始したときに実行されるイベント
// ------------------------------------------------------------
file_reference.addEventListener( Event.OPEN , function (e:Event):void{
text_field.text = "(1) HTTP 通信を開始した\n" + text_field.text;
});
// ------------------------------------------------------------
// リクエストボディを送信中に繰り返し実行されるイベント
// ------------------------------------------------------------
file_reference.addEventListener( ProgressEvent.PROGRESS , function (e:ProgressEvent):void{
// これまでに完了した送信バイト数
var loaded:Number = e.bytesLoaded;
// 全体の送信バイト数
var total:Number = e.bytesTotal;
// パーセント
var percent:Number = Math.floor(e.bytesLoaded / e.bytesTotal * 100);
text_field.text = "(2) リクエストボディを送信中 (loaded:" + (loaded) + " total:" + (total) + " percent:" + (percent) + ")\n" + text_field.text;
});
// ------------------------------------------------------------
// レスポンスヘッダの受信が完了したときに実行されるイベント(Adobe AIR のみ)
// ------------------------------------------------------------
if(HTTPStatusEvent.HTTP_RESPONSE_STATUS){
file_reference.addEventListener( HTTPStatusEvent.HTTP_RESPONSE_STATUS , function (e:HTTPStatusEvent):void{
var str:String = "(3) レスポンスヘッダの受信が完了した\n";
// ------------------------------------------------------------
// レスポンスヘッダのリストを取得する
// ------------------------------------------------------------
var header_list:Array = e.responseHeaders;
var num:int = header_list.length;
var i:int;
for(i=0;i < num;i++){
// ------------------------------------------------------------
// レスポンスヘッダを取得
// ------------------------------------------------------------
var header:URLRequestHeader = header_list[i];
// 名前を取得する
var name:String = header.name;
// 値を取得する
var value:String = header.value;
str += " name:" + name + " value:" + value + "\n";
}
text_field.text = (str) + text_field.text;
});
}
// ------------------------------------------------------------
// リクエストが失敗したときに実行されるイベント
// ------------------------------------------------------------
file_reference.addEventListener( HTTPStatusEvent.HTTP_STATUS , function (e:HTTPStatusEvent):void{
text_field.text = "(3) レスポンスヘッダの受信が完了した、リクエストの失敗 (status:" + (e.status) + ")\n" + text_field.text;
});
// ------------------------------------------------------------
// レスポンスボディの受信が完了したときに実行されるイベント
// ------------------------------------------------------------
file_reference.addEventListener( DataEvent.UPLOAD_COMPLETE_DATA , function (e:DataEvent):void{
// ------------------------------------------------------------
// レスポンスボディを取得
// ------------------------------------------------------------
var response:* = e.data;
text_field.text = "(4) レスポンスボディの受信が完了した (response:" + (response) + "\n" + text_field.text;
});
// ------------------------------------------------------------
// アップロードが成功すると実行されるイベント
// ------------------------------------------------------------
file_reference.addEventListener( Event.COMPLETE , function (e:Event):void{
text_field.text = "アップロード成功、リクエストの成功\n" + text_field.text;
});
// ------------------------------------------------------------
// 入出力エラーが発生すると実行されるイベント
// ------------------------------------------------------------
file_reference.addEventListener( IOErrorEvent.IO_ERROR , function (e:IOErrorEvent):void{
text_field.text = "アップロード失敗、入出力エラー\n" + text_field.text;
});
// ------------------------------------------------------------
// セキュリティエラーが発生すると実行されるイベント
// ------------------------------------------------------------
file_reference.addEventListener( SecurityErrorEvent.SECURITY_ERROR , function (e:SecurityErrorEvent):void{
text_field.text = "アップロード失敗、セキュリティエラー\n" + text_field.text;
});
// ------------------------------------------------------------
// マウスの左ボタンをクリックすると実行されるイベント
// ------------------------------------------------------------
stage.addEventListener( MouseEvent.MOUSE_DOWN , function (e:MouseEvent):void{
try{
// ------------------------------------------------------------
// ファイル選択ダイアログを開く
// ------------------------------------------------------------
var result:Boolean = file_reference.browse();
text_field.text = "ファイル選択の開始 (result:" + (result) + ")\n" + text_field.text;
}catch(e:Error){
text_field.text = "ファイル選択の開始 (result:" + (false) + " message:" + (e) + ")\n" + text_field.text;
}
});
■アップロードのセキュリティについて
■クロスドメインポリシーによる制限
別ドメインのサーバーと、HTTP 通信を行う事はできません。
Adobe AIR の場合、クロスドメインポリシーによる制限はありません。
クロスドメインポリシーは、解除できます。
■クロスドメインポリシーの解除について
サーバー側に、クロスドメインポリシーファイルを設置します。
■ Flash 側の処理について
もしサブフォルダにポリシーファイルが設置されている場合、事前に loadPolicyFile() メソッドを実行します。
ファイルをダウンロードする
■ダウンロードの仕様について
リクエストについて
URLRequest クラスを使って、任意のデータを送信できます。
ダウンロードの注意点
ダウンロード処理は、Flash Player が行います。
ダウンロード中は、Flash が動作し続けている必要があります。
もし、Flash Player が消滅した場合、ダウンロードは失敗します。
JavaScript を使って、ページの遷移時に警告を表示する事ができます。
こちらで解説しています。
レスポンスについて
レスポンスヘッダなどを取得する事はできません。
■ダウンロードを開始する
download() メソッドを使用します。
このメソッドは、非同期実行です。
呼び出すと、ファイル保存ダイアログが開かれます。
ファイル保存操作を行うと、すぐに HTTP 通信が開始されます。
ダウンロードの結果を得るには、イベントを使用します。
FileReference.download ( request , "defaultFileName" ) :void
第01引数 | URLRequest | URLRequest オブジェクトを指定 |
第02引数(略可) | String | 保存する際のデフォルトのファイル名を指定 |
戻り値 | void | なし |
■第01引数 (URLRequest)
リクエストに関する設定を行います。
URLRequest クラスについては、こちらで解説しています。
追加の送信データを含める方法については、こちらで解説しています。
■エラーが発生する場合
ファイル保存ダイアログを開くのに失敗した場合、エラーが発生します。
2つ以上のファイル保存ダイアログを、同時に表示する事はできません。
■ダイアログのセキュリティについて
マウスやキーボードなどの押下操作中に限って、実行する事ができます。
■ダイアログの操作結果を取得する
以下のイベントを使用します。
定数 | 型 | 説明 |
SELECT | Event | ファイルを保存操作した場合に実行される |
CANCEL | Event | キャンセルした場合に実行される |
■ブラウザを使って通信内容を確認する
ブラウザの開発者向けツールを使用すると、通信内容を確認する事ができます。
使用方法は、こちらで解説しています。
■ダウンロード結果を取得する
■ HTTP 通信の進捗状況を取得する
定数 | 型 | 説明 |
OPEN | Event | (1) HTTP 通信を開始した |
PROGRESS | ProgressEvent | (2) レスポンスボディを受信中 |
■ HTTP 通信の完了を取得する
以下の3つのイベントは、同時に発行されることはありません。
よって1つでも欠けている場合、通信の完了を取りこぼします。
定数 | 型 | 説明 |
COMPLETE | Event | ダウンロード成功(リクエストも成功) |
IO_ERROR | IOErrorEvent | ダウンロード失敗 |
SECURITY_ERROR | SecurityErrorEvent | ダウンロード失敗(原因はセキュリティ) |
■使用例
ファイルをダウンロードして保存する
import flash.net.FileReference;
import flash.net.URLRequest;
import flash.net.URLRequestMethod;
import flash.net.URLVariables;
import flash.text.TextField;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.events.ProgressEvent;
import flash.events.IOErrorEvent;
import flash.events.SecurityErrorEvent;
// ------------------------------------------------------------
// テキストフィールドを作成
// ------------------------------------------------------------
var text_field:TextField = new TextField();
// 位置とサイズ
text_field.x = 10;
text_field.y = 10;
text_field.width = stage.stageWidth - 20;
text_field.height = stage.stageHeight - 20;
// 枠線を表示
text_field.border = true;
// ステージに配置
stage.addChild(text_field);
// ------------------------------------------------------------
// FileReference オブジェクトを作成する
// ------------------------------------------------------------
var file_reference:FileReference = new FileReference();
// ------------------------------------------------------------
// ファイルを保存操作した場合に実行されるイベント
// ------------------------------------------------------------
file_reference.addEventListener( Event.SELECT , function (e:Event):void{
text_field.text = "ファイルを保存操作した\n" + text_field.text;
});
// ------------------------------------------------------------
// キャンセルした場合に実行されるイベント
// ------------------------------------------------------------
file_reference.addEventListener( Event.CANCEL , function (e:Event):void{
text_field.text = "ファイル選択をキャンセルした\n" + text_field.text;
});
// ------------------------------------------------------------
// HTTP 通信を開始したときに実行されるイベント
// ------------------------------------------------------------
file_reference.addEventListener( Event.OPEN , function (e:Event):void{
text_field.text = "(1) HTTP 通信を開始した\n" + text_field.text;
});
// ------------------------------------------------------------
// レスポンスボディを受信中に繰り返し実行されるイベント
// ------------------------------------------------------------
file_reference.addEventListener( ProgressEvent.PROGRESS , function (e:ProgressEvent):void{
// これまでに完了した受信バイト数
var loaded:Number = e.bytesLoaded;
// 全体の受信バイト数
var total:Number = e.bytesTotal;
// パーセント
var percent:Number = Math.floor(e.bytesLoaded / e.bytesTotal * 100);
text_field.text = "(2) レスポンスボディを受信中 (loaded:" + (loaded) + " total:" + (total) + " percent:" + (percent) + ")\n" + text_field.text;
});
// ------------------------------------------------------------
// ダウンロードが成功すると実行されるイベント
// ------------------------------------------------------------
file_reference.addEventListener( Event.COMPLETE , function (e:Event):void{
text_field.text = "ダウンロード成功、リクエストの成功\n" + text_field.text;
});
// ------------------------------------------------------------
// 入出力エラーが発生すると実行されるイベント
// ------------------------------------------------------------
file_reference.addEventListener( IOErrorEvent.IO_ERROR , function (e:IOErrorEvent):void{
text_field.text = "ダウンロード失敗、入出力エラー\n" + text_field.text;
});
// ------------------------------------------------------------
// セキュリティエラーが発生すると実行されるイベント
// ------------------------------------------------------------
file_reference.addEventListener( SecurityErrorEvent.SECURITY_ERROR , function (e:SecurityErrorEvent):void{
text_field.text = "ダウンロード失敗、セキュリティエラー\n" + text_field.text;
});
// ------------------------------------------------------------
// マウスの左ボタンをクリックすると実行されるイベント
// ------------------------------------------------------------
stage.addEventListener( MouseEvent.MOUSE_DOWN , function (e:MouseEvent):void{
// ------------------------------------------------------------
// URLRequest オブジェクトを作成する
// ------------------------------------------------------------
var url_request:URLRequest = new URLRequest("http://example.com/download/binary.dat");
// ------------------------------------------------------------
// 「HTTP メソッド」を設定する
// ------------------------------------------------------------
url_request.method = URLRequestMethod.POST;
// ------------------------------------------------------------
// 追加の送信データを指定する
// ------------------------------------------------------------
// URLVariables オブジェクトを作成する
var url_variables:URLVariables = new URLVariables();
// 「名前と値情報」を追加する
url_variables["user"] = "taro";
url_variables["age"] = "18";
url_variables["blood"] = "b";
// 送信データを指定する
url_request.data = url_variables;
try{
// ------------------------------------------------------------
// ダウンロードを開始する
// ------------------------------------------------------------
file_reference.download( url_request , "defaultName.dat" );
text_field.text = "ファイル保存の開始 (result:" + (true) + ")\n" + text_field.text;
}catch(e:Error){
text_field.text = "ファイル保存の開始 (result:" + (false) + " message:" + (e) + ")\n" + text_field.text;
}
});
■ダウンロードのセキュリティについて
■クロスドメインポリシーによる制限
別ドメインのサーバーと、HTTP 通信を行う事はできません。
Adobe AIR の場合、クロスドメインポリシーによる制限はありません。
クロスドメインポリシーは、解除できます。
■クロスドメインポリシーの解除について
サーバー側に、クロスドメインポリシーファイルを設置します。
■ Flash 側の処理について
もしサブフォルダにポリシーファイルが設置されている場合、事前に loadPolicyFile() メソッドを実行します。
ローカルからファイルを読み込む (Flash 10 以降)
■読み込みを開始する
1.ファイルを選択する
こちらで解説しています。
アクセスできるのは、ユーザーが選択(許可)したファイルのみです。
2.読み込みを開始する
load() メソッドを使用します。
読み込みの開始に失敗した場合、エラーが発生します。
FileReference.load ( ) :void
引数 | void | なし |
戻り値 | void | なし |
3.読み込んだデータを取得する
data プロパティを使用します。
データ型は、ByteArray です。
画像や SWF ファイルを読み込んで、動的に活用する事もできます。
■読み込みの結果を取得する
■読み込みの進捗状況を取得する
定数 | 型 | 説明 |
OPEN | Event | (1) 読み込み処理を開始した |
PROGRESS | ProgressEvent | (2) 読み込み中に繰り返し発行される |
■読み込みの完了を取得する
以下の2つのイベントは、同時に発行されることはありません。
よって1つでも欠けている場合、読み込みの完了を取りこぼします。
定数 | 型 | 説明 |
COMPLETE | Event | 読み込み成功 |
IO_ERROR | IOErrorEvent | 読み込み失敗(原因は入出力エラー) |
■使用例
ローカルのテキストファイルを読み込んで、結果を取得する
import flash.net.FileReference;
import flash.utils.ByteArray;
import flash.text.TextField;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.events.ProgressEvent;
import flash.events.IOErrorEvent;
// ------------------------------------------------------------
// テキストフィールドを作成
// ------------------------------------------------------------
var text_field:TextField = new TextField();
// 位置とサイズ
text_field.x = 10;
text_field.y = 10;
text_field.width = stage.stageWidth - 20;
text_field.height = stage.stageHeight - 20;
// 枠線を表示
text_field.border = true;
// ステージに配置
stage.addChild(text_field);
// ------------------------------------------------------------
// FileReference オブジェクトを作成する
// ------------------------------------------------------------
var file_reference:FileReference = new FileReference();
// ------------------------------------------------------------
// ファイルを選択した場合に実行されるイベント
// ------------------------------------------------------------
file_reference.addEventListener( Event.SELECT , function (e:Event):void{
try{
// ------------------------------------------------------------
// 読み込みを開始する
// ------------------------------------------------------------
file_reference.load();
text_field.text = "読み込み開始 (result:" + (true) + ")\n" + text_field.text;
}catch(e:Error){
text_field.text = "読み込み開始 (result:" + (false) + " message:" + (e) + ")\n" + text_field.text;
}
});
// ------------------------------------------------------------
// キャンセルした場合に実行されるイベント
// ------------------------------------------------------------
file_reference.addEventListener( Event.CANCEL , function (e:Event):void{
text_field.text = "ファイル選択をキャンセルした\n" + text_field.text;
});
// ------------------------------------------------------------
// 読み込み処理を開始したときに実行されるイベント
// ------------------------------------------------------------
file_reference.addEventListener( Event.OPEN , function (e:Event):void{
text_field.text = "(1) 読み込み処理を開始した\n" + text_field.text;
});
// ------------------------------------------------------------
// 読み込み中に繰り返し実行されるイベント
// ------------------------------------------------------------
file_reference.addEventListener( ProgressEvent.PROGRESS , function (e:ProgressEvent):void{
// これまでに完了したバイト数
var loaded:Number = e.bytesLoaded;
// 全体のバイト数
var total:Number = e.bytesTotal;
// パーセント
var percent:Number = Math.floor(e.bytesLoaded / e.bytesTotal * 100);
text_field.text = "(2) 読み込み中 (loaded:" + (loaded) + " total:" + (total) + " percent:" + (percent) + ")\n" + text_field.text;
});
// ------------------------------------------------------------
// 読み込みが成功すると実行されるイベント
// ------------------------------------------------------------
file_reference.addEventListener( Event.COMPLETE , function (e:Event):void{
text_field.text = "読み込み成功\n" + text_field.text;
// ------------------------------------------------------------
// 出力テスト
// ------------------------------------------------------------
trace( file_reference.name );
trace( file_reference.size );
trace( file_reference.type );
trace( file_reference.creationDate );
trace( file_reference.modificationDate );
trace( file_reference.creator );
// ------------------------------------------------------------
// 読み込んだバイナリデータを取得
// ------------------------------------------------------------
var data:ByteArray = file_reference.data;
// ------------------------------------------------------------
// 「"UTF-8" 形式のバイナリ」から文字列を取得する
// ------------------------------------------------------------
var str:String = data.readMultiByte(data.length , "utf-8");
text_field.text = (str) + "\n" + text_field.text;
});
// ------------------------------------------------------------
// 入出力エラーが発生すると実行されるイベント
// ------------------------------------------------------------
file_reference.addEventListener( IOErrorEvent.IO_ERROR , function (e:IOErrorEvent):void{
text_field.text = "読み込み失敗、入出力エラー\n" + text_field.text;
});
// ------------------------------------------------------------
// マウスの左ボタンをクリックすると実行されるイベント
// ------------------------------------------------------------
stage.addEventListener( MouseEvent.MOUSE_DOWN , function (e:MouseEvent):void{
try{
// ------------------------------------------------------------
// ファイル選択ダイアログを開く
// ------------------------------------------------------------
var result:Boolean = file_reference.browse();
text_field.text = "ファイル選択の開始 (result:" + (result) + ")\n" + text_field.text;
}catch(e:Error){
text_field.text = "ファイル選択の開始 (result:" + (false) + " message:" + (e) + ")\n" + text_field.text;
}
});
ローカルにファイルを保存する (Flash 10 以降)
■書き込みを開始する
save() メソッドを使用します。
呼び出すと、ファイル保存ダイアログが開かれます。
ファイル保存操作を行うと、すぐに書き込み処理が開始されます。
書き込み処理の結果を得るには、イベントを使用します。
FileReference.save ( data , "defaultFileName" ) :void
第01引数 | * | 保存データを指定 |
第02引数(略可) | String | 保存する際のデフォルトのファイル名を指定 |
戻り値 | void | なし |
■第01引数 (保存データ)
以下のデータ型の指定に対応しています。
■エラーが発生する場合
ファイル保存ダイアログを開くのに失敗した場合、エラーが発生します。
2つ以上のファイル保存ダイアログを、同時に表示する事はできません。
■ダイアログのセキュリティについて
マウスやキーボードなどの押下操作中に限って、実行する事ができます。
■ダイアログの操作結果を取得する
以下のイベントを使用します。
定数 | 型 | 説明 |
SELECT | Event | ファイルを保存操作した場合に実行される |
CANCEL | Event | キャンセルした場合に実行される |
■書き込みの結果を取得する
■書き込みの進捗状況を取得する
定数 | 型 | 説明 |
OPEN | Event | (1) 書き込み処理を開始した |
PROGRESS | ProgressEvent | (2) 書き込み中に繰り返し発行される |
■書き込みの完了を取得する
以下の2つのイベントは、同時に発行されることはありません。
よって1つでも欠けている場合、書き込みの完了を取りこぼします。
定数 | 型 | 説明 |
COMPLETE | Event | 書き込み成功 |
IO_ERROR | IOErrorEvent | 書き込み失敗(原因は入出力エラー) |
■使用例
バイナリを保存して、結果を取得する
import flash.net.FileReference;
import flash.utils.ByteArray;
import flash.text.TextField;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.events.ProgressEvent;
import flash.events.IOErrorEvent;
// ------------------------------------------------------------
// テキストフィールドを作成
// ------------------------------------------------------------
var text_field:TextField = new TextField();
// 位置とサイズ
text_field.x = 10;
text_field.y = 10;
text_field.width = stage.stageWidth - 20;
text_field.height = stage.stageHeight - 20;
// 枠線を表示
text_field.border = true;
// ステージに配置
stage.addChild(text_field);
// ------------------------------------------------------------
// 100 MByte 相当のバイナリデータを用意する
// ------------------------------------------------------------
var save_data:ByteArray = new ByteArray();
save_data.position = 1024 * 1024 * 100;
save_data.writeByte(0xFF);
// ------------------------------------------------------------
// FileReference オブジェクトを作成する
// ------------------------------------------------------------
var file_reference:FileReference = new FileReference();
// ------------------------------------------------------------
// ファイルを選択した場合に実行されるイベント
// ------------------------------------------------------------
file_reference.addEventListener( Event.SELECT , function (e:Event):void{
text_field.text = "ファイルを保存操作した\n" + text_field.text;
});
// ------------------------------------------------------------
// キャンセルした場合に実行されるイベント
// ------------------------------------------------------------
file_reference.addEventListener( Event.CANCEL , function (e:Event):void{
text_field.text = "ファイル選択をキャンセルした\n" + text_field.text;
});
// ------------------------------------------------------------
// 書き込み処理を開始したときに実行されるイベント
// ------------------------------------------------------------
file_reference.addEventListener( Event.OPEN , function (e:Event):void{
text_field.text = "(1) 書き込み処理を開始した\n" + text_field.text;
});
// ------------------------------------------------------------
// 書き込み中に繰り返し実行されるイベント
// ------------------------------------------------------------
file_reference.addEventListener( ProgressEvent.PROGRESS , function (e:ProgressEvent):void{
// これまでに完了したバイト数
var loaded:Number = e.bytesLoaded;
// 全体のバイト数
var total:Number = e.bytesTotal;
// パーセント
var percent:Number = Math.floor(e.bytesLoaded / e.bytesTotal * 100);
text_field.text = "(2) 書き込み中 (loaded:" + (loaded) + " total:" + (total) + " percent:" + (percent) + ")\n" + text_field.text;
});
// ------------------------------------------------------------
// 書き込みが成功すると実行されるイベント
// ------------------------------------------------------------
file_reference.addEventListener( Event.COMPLETE , function (e:Event):void{
text_field.text = "書き込み成功\n" + text_field.text;
});
// ------------------------------------------------------------
// 入出力エラーが発生すると実行されるイベント
// ------------------------------------------------------------
file_reference.addEventListener( IOErrorEvent.IO_ERROR , function (e:IOErrorEvent):void{
text_field.text = "書き込み失敗、入出力エラー\n" + text_field.text;
});
// ------------------------------------------------------------
// マウスの左ボタンをクリックすると実行されるイベント
// ------------------------------------------------------------
stage.addEventListener( MouseEvent.MOUSE_DOWN , function (e:MouseEvent):void{
try{
// ------------------------------------------------------------
// 書き込みを開始する
// ------------------------------------------------------------
file_reference.save( save_data , "defaultName.dat" );
text_field.text = "書き込み開始 (result:" + (true) + ")\n" + text_field.text;
}catch(e:Error){
text_field.text = "書き込み開始 (result:" + (false) + " message:" + (e) + ")\n" + text_field.text;
}
});