Flashゲームプログラミング講座 for ActionScript3.0

 

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){
	}

});
 

■ファイル情報を取得する

 
ファイルを選択すると、以下のプロパティからファイル情報が得られます。
 
ファイルの中身を読み取る方法については、こちらで解説しています。
 
プロパティ名説明
nameStringファイル名
sizeNumberサイズ
typeStringファイル形式
creationDateDate作成日
modificationDateDate最終更新日
creatorStringクリエータタイプ(Macintosh)
 

■ファイル選択のフィルタについて

 
■ FileFilter オブジェクトを作成する
 
new 演算子を使って、FileFilter クラスをインスタンス化します。
 
new FileFilter ( description , extension , macType ) :FileFilter
第01引数 Stringdescription プロパティと同等
第02引数 Stringextension プロパティと同等
第03引数(略可)StringmacType プロパティと同等
戻り値 FileFilter新しい FileFilter オブジェクト
 
■プロパティについて
 
プロパティ名説明
descriptionString説明文
extensionString拡張子のリスト。『 *.拡張子 』と記述。
複数記述する場合はセミコロン ; で挟む
macTypeStringMacintosh ファイルタイプのリスト(省略可能)
複数記述する場合はセミコロン ; で挟む
 
■使用例
 
フィルタを指定して、ファイル選択ダイアログを開く

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 形式です。
 
送信データについて
 
ファイルの name 属性は、"Filedata" となります。
 
upload() メソッドの第02引数から、別の名前に変更する事もできます。
 
1度に、複数のファイルを送信する事はできません。
 
ファイルの送信と同時に、任意のデータも送信できます。
 
レスポンスについて
 
レスポンスボディを受信できます。結果は、String 型で得られます。
 
VARIABLES 形式に変換したい場合、URLVariables クラスを使用します。
 
Adobe AIR では、さらにレスポンスヘッダの取得も可能です。
 
サーバー側(CGI)の実装について
 
こちらで解説しています。
 
HTML によるアップロードについては、こちらで解説しています。
 

■送信データを指定する

 
URLRequest クラスを使用します。
 
data プロパティに、送信データを指定します。
 
URLVariables オブジェクトを渡すといいでしょう。
 
明示的に、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() メソッドを使用します。
 
このメソッドは、非同期実行です。
 
HTTP 通信の結果を得るには、イベントを使用します。
 
アップロードの開始に失敗した場合、エラーが発生します。
 
FileReference.upload ( request , uploadDataFieldName , testUpload ) :void
第01引数 URLRequestURLRequest オブジェクトを指定
第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() メソッドを実行します。
 
マスターポリシーファイルに限っては、自動的に読み込まれます。
 
マスターポリシーファイルにて解決する場合、loadPolicyFile() メソッドは不要です。
 


 

ファイルをダウンロードする

 
 


■ダウンロードの仕様について

 
リクエストについて
 
URLRequest クラスを使って、任意のデータを送信できます。
 
ダウンロードの注意点
 
ダウンロード処理は、Flash Player が行います。
 
ダウンロード中は、Flash が動作し続けている必要があります。
 
もし、Flash Player が消滅した場合、ダウンロードは失敗します。
 
JavaScript を使って、ページの遷移時に警告を表示する事ができます。
 
こちらで解説しています。
 
レスポンスについて
 
ダウンロードが完了すると、保存ファイルを選択している状態となります。
 
ファイルの情報を取得できます。
 
レスポンスヘッダなどを取得する事はできません。
 

■ダウンロードを開始する

 
download() メソッドを使用します。
 
このメソッドは、非同期実行です。
 
呼び出すと、ファイル保存ダイアログが開かれます。
 
ファイル保存操作を行うと、すぐに HTTP 通信が開始されます。
 
ダウンロードの結果を得るには、イベントを使用します。
 
FileReference.download ( request , "defaultFileName" ) :void
第01引数 URLRequestURLRequest オブジェクトを指定
第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() メソッドを実行します。
 
マスターポリシーファイルに限っては、自動的に読み込まれます。
 
マスターポリシーファイルにて解決する場合、loadPolicyFile() メソッドは不要です。
 


 

ローカルからファイルを読み込む (Flash 10 以降)

 
 


■読み込みを開始する

 
1.ファイルを選択する
 
こちらで解説しています。
 
アクセスできるのは、ユーザーが選択(許可)したファイルのみです。
 
2.読み込みを開始する
 
load() メソッドを使用します。
 
このメソッドは、非同期実行です。
 
読み込みの結果を得るには、イベントを使用します。
 
読み込みの開始に失敗した場合、エラーが発生します。
 
FileReference.load ( ) :void
引数 voidなし
戻り値 voidなし
 
3.読み込んだデータを取得する
 
data プロパティを使用します。
 
データ型は、ByteArray です。
 
文字列に変換したい場合、readMultiByte() メソッドを使用します。
 
XML ファイルをパースする方法については、こちらで解説しています。
 
画像や 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引数 (保存データ)
 
以下のデータ型の指定に対応しています。
 
説明
String テキストファイルとして保存(UTF-8 形式)
XML XML ファイルとして保存(UTF-8 形式)
ByteArray バイナリファイルとして保存
 
■エラーが発生する場合
 
ファイル保存ダイアログを開くのに失敗した場合、エラーが発生します。
 
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;
	}

});