FileReference クラスの使用

Flash Player 9 以降、Adobe AIR 1.0 以降

FileReference オブジェクトはクライアントまたはサーバーマシン上のデータファイルを表します。FileReference クラスのメソッドを使用して、アプリケーションでデータファイルをローカルにロードおよび保存したり、リモートサーバーとの間でファイルデータを転送したりできます。

FileReference クラスには、データファイルをロード、転送、保存する 2 つの異なる方法が用意されています。FileReference クラスには、導入時から browse() メソッド、 upload() メソッドおよび download() メソッドが用意されています。 browse() メソッドを使用すると、ユーザーはファイルを選択できるようになります。 upload() メソッドは、ファイルデータをリモートサーバーへ転送するのに使用します。 download() メソッドでは、データをサーバーから取得して、ローカルファイルに保存します。Flash Player 10 および Adobe AIR 1.5 以降、FileReference クラスには load() メソッドおよび save() メソッドが含まれています。 load() メソッドおよび save() メソッドを使用すると、ローカルファイルに直接アクセスして保存することもできます。これらのメソッドの使用法は、URLLoader および Loader クラスが持つ同等の名前のメソッドとほぼ同じです。

注意: FileReference クラスを拡張したクラスである File クラスと、FileStream クラスにより、ファイルとローカルファイルシステムを扱うための様々な機能が追加されます。File クラスと FileStream クラスは AIR でのみサポートされ、Flash Player ではサポートされません。

以下の参照をお勧めします。

Load and Save Local Files

Kevin Hoyt
Flash でローカルコンテンツの読み込みと保存が簡単にできることを Kevin Hoyt が解説するビデオです。

FileReference クラス

各 FileReference オブジェクトは、ローカルマシン上の 1 つのデータファイルを表します。FileReference クラスのプロパティには、ファイルのサイズ、種類、名前、ファイル拡張子、作成者、作成日および変更日の情報が含まれています。

注意: creator プロパティは Mac OS でのみサポートされており、それ以外のすべてのプラットフォームでは null が返されます。
注意: extension プロパティは Adobe AIR でのみサポートされています。

FileReference クラスのインスタンスを作成する方法は 2 種類あります。

  • 以下のコードに示すように、 new 演算子を使用します。
    import flash.net.FileReference; 
    var fileRef:FileReference = new FileReference();
  • FileReferenceList.browse() メソッドを呼び出して、アップロードするファイルをユーザーが選択できるダイアログボックスを開きます。ユーザーによって 1 つ以上のファイルが正しく選択された場合は、FileReference オブジェクトの配列が作成されます。

FileReference オブジェクトを作成した後は、以下の操作を実行できます。

  • FileReference.browse() メソッドを呼び出して、ローカルファイルシステムの 1 つのファイルをユーザーが選択できるダイアログボックスを開きます。この操作は通常、 FileReference.upload() メソッドまたは FileReference.load() メソッドを後で呼び出す前に実行します。 FileReference.upload() メソッドを呼び出して、ファイルをリモートサーバーにアップロードします。 FileReference.load() メソッドを呼び出して、ローカルファイルを開きます。

  • FileReference.download() メソッドを呼び出します。これにより、新しいファイルの保存場所をユーザーが選択できるダイアログボックスが開きます。その後、サーバーからのデータがダウンロードされ、新しいファイルに保存されます。

  • FileReference.load() メソッドを呼び出します。このメソッドは、先に browse() メソッドで選択されたファイルからデータをロードする処理を開始します。 browse() 操作が完了(ユーザーがファイルを選択)するまで、 load() メソッドを呼び出すことはできません。

  • FileReference.save() メソッドを呼び出します。このメソッドは、ダイアログボックスを表示し、ローカルファイルシステム上のファイルの場所を 1 つ選択することをユーザーに求めます。次に、指定された場所にデータを保存します。

注意: browse() download() または save() のアクションを複数並行して実行することはできません。これは、一度に 1 つしかダイアログボックスを表示できないからです。

name size modificationDate などの FileReference オブジェクトのプロパティは、以下のいずれかの操作が行われるまで定義されません。

  • FileReference.browse() メソッドまたは FileReferenceList.browse() メソッドが呼び出され、ユーザーがダイアログボックスからファイルを選択する。

  • FileReference.download() メソッドが呼び出され、ユーザーがダイアログボックスから新しいファイルの場所を指定する。

注意: ダウンロードを実行する場合、 FileReference.name プロパティだけはダウンロードの完了より前に設定されます。ダウンロードが完了すると、すべてのプロパティの値が設定されます。

ほとんどのプレーヤーでは、 FileReference.browse() FileReferenceList.browse() FileReference.download() FileReference.load() または FileReference.save() メソッドの実行中も、イベントの送出やコードの実行を含めた SWF ファイルの再生処理が続行されます。

アップロード処理およびダウンロード処理では、当該 SWF ファイル自体が属するドメイン内のファイルと、ポリシーファイルで指定されたドメイン内のファイルに対してのみアクセスできます。SWF ファイルとは異なるドメインにあるサーバー上のファイルに対して SWF からアップロードまたはダウンロード操作を開始するには、そのサーバー上にポリシーファイルが置かれている必要があります。

FileReference 」を参照してください。

ファイルからのデータのロード

FileReference.load() メソッドでは、ローカルファイルからのデータをメモリにロードできます。

注意: アプリケーションのコードでは、まず FileReference.browse() メソッドを呼び出して、ロードするファイルをユーザーに選択させる必要があります。この制限は、アプリケーションセキュリティサンドボックスで実行されている Adobe AIR のコンテンツには適用されません。

FileReference.load() メソッドは呼び出されると直ちに戻りますが、ロードするデータは直ちに使用可能とはなりません。FileReference オブジェクトは、ロードプロセスの各段階で、リスナーメソッドを呼び出すイベントを送出します。

FileReference オブジェクトからロードプロセス中に送出されるのは次のイベントです。

  • open イベント( Event.OPEN ):ロード処理が開始したときに送出されます。

  • progress イベント( ProgressEvent.PROGRESS ):ファイルのデータバイトが読み取られると定期的に送出されます。

  • complete イベント( Event.COMPLETE ):ファイルのロード処理が正常に完了したときに送出されます。

  • ioError イベント:( IOErrorEvent.IO_ERROR ):ファイルを開く際やデータを読み取る際に入出力エラーが発生し、それが原因でロードプロセスが失敗した場合に送出されます。

FileReference オブジェクトから complete イベントが送出された後は、その FileReference オブジェクトの data プロパティに格納された ByteArray として、ロードしたデータにアクセスできます。

次の例は、ユーザーにファイルを選択するよう求め、そのファイルからのデータをメモリにロードする方法を示します。

package 
{ 
     import flash.display.Sprite; 
    import flash.events.*;  
    import flash.net.FileFilter; 
    import flash.net.FileReference; 
    import flash.net.URLRequest; 
    import flash.utils.ByteArray; 
 
    public class FileReferenceExample1 extends Sprite 
    { 
        private var fileRef:FileReference; 
        public function FileReferenceExample1() 
        { 
            fileRef = new FileReference(); 
            fileRef.addEventListener(Event.SELECT, onFileSelected); 
            fileRef.addEventListener(Event.CANCEL, onCancel); 
            fileRef.addEventListener(IOErrorEvent.IO_ERROR, onIOError); 
            fileRef.addEventListener(SecurityErrorEvent.SECURITY_ERROR, 
                        onSecurityError); 
            var textTypeFilter:FileFilter = new FileFilter("Text Files (*.txt, *.rtf)", 
                        "*.txt;*.rtf"); 
            fileRef.browse([textTypeFilter]); 
        } 
        public function onFileSelected(evt:Event):void 
        { 
            fileRef.addEventListener(ProgressEvent.PROGRESS, onProgress); 
            fileRef.addEventListener(Event.COMPLETE, onComplete); 
            fileRef.load(); 
        } 
 
        public function onProgress(evt:ProgressEvent):void 
        { 
            trace("Loaded " + evt.bytesLoaded + " of " + evt.bytesTotal + " bytes."); 
        } 
 
        public function onComplete(evt:Event):void 
        { 
            trace("File was successfully loaded."); 
            trace(fileRef.data); 
        } 
 
        public function onCancel(evt:Event):void 
        { 
            trace("The browse request was canceled by the user."); 
        } 
 
        public function onIOError(evt:IOErrorEvent):void 
        { 
            trace("There was an IO Error."); 
        } 
        public function onSecurityError(evt:Event):void 
        { 
            trace("There was a security error."); 
        } 
    } 
}

例のコードでは、 fileRef という名前の FileReference オブジェクトを作成し、このオブジェクトの browse() メソッドを呼び出しています。 browse() メソッドによりダイアログボックスを開いて、ユーザーがファイルを選択できるようにします。ファイルを選択すると、 onFileSelected() メソッドが呼び出されます。このメソッドでは、 progress および complete イベントのリスナーを追加してから、FileReference オブジェクトの load() メソッドを呼び出します。他のハンドラーメソッドは、ロード操作の進行状況を知らせるメッセージを出力するだけです。ロードが完了すると、このアプリケーションは、ロードしたファイルの内容を trace() メソッドで表示します。

Adobe AIR の FileStream クラスには、ローカルファイルからデータを読み取るための機能が用意されています。 ファイルの読み取りと書き込み を参照してください。

ローカルファイルへのデータの保存

FileReference.save() メソッドでは、ローカルファイルにデータを保存できます。最初に、新しいファイル名と、ファイルを保存する新しい場所をユーザーが入力できるダイアログボックスを開きます。ユーザーがファイル名と場所を選択すると、データが新しいファイルに書き込まれます。ファイルが正常に保存されると、FileReference オブジェクトのプロパティにローカルファイルのプロパティが設定されます。

注意: アプリケーションのコードで FileReference.save() メソッドを呼び出す操作は、マウスクリックまたはキー押下イベントなど、ユーザーイベントに応答する形でのみ実行してください。それ以外の場合はエラーが発生します。この制限は、アプリケーションセキュリティサンドボックスで実行されている Adobe AIR のコンテンツには適用されません。

FileReference.save() メソッドは呼び出されると直ちに戻ります。FileReference オブジェクトは、ファイル保存プロセスの各段階で、リスナーメソッドを呼び出すイベントを送出します。

FileReference オブジェクトはファイル保存プロセスで以下のイベントを送出します。

  • select イベント( Event.SELECT ):新しく保存するファイルのファイル名と場所をユーザーが指定した場合に送出されます。

  • cancel イベント( Event.CANCEL ):ユーザーがダイアログボックスの「キャンセル」ボタンをクリックした場合に送出されます。

  • open イベント( Event.OPEN ):保存処理が開始したときに送出されます。

  • progress イベント( ProgressEvent.PROGRESS ):ファイルのデータバイトが保存されると定期的に送出されます。

  • complete イベント( Event.COMPLETE ):ファイルの保存処理が正常に完了したときに送出されます。

  • ioError イベント:( IOErrorEvent.IO_ERROR ):データをファイルに保存しようとした際に入出力エラーが発生し、それが原因で保存プロセスが失敗した場合に送出されます。

ファイルにデータを書き込む方法は、次のように、 FileReference.save() メソッドの data パラメーターに渡されるオブジェクトの型により決定されます。

  • String 値の場合、UTF-8 エンコーディングを使用してテキストファイルとして保存されます。

  • XML オブジェクトの場合、すべての形式が維持された XML 形式でファイルに書き込まれます。

  • ByteArray オブジェクトの場合、コンテンツは変換されずにファイルに直接書き込まれます。

  • 他のオブジェクトの場合、 FileReference.save() メソッドはそのオブジェクトの toString() メソッドを呼び出し、結果として取得した String 値を UTF-8 テキストファイルに保存します。オブジェクトの toString() メソッドを呼び出すことができない場合は、エラーがスローされます。

data パラメーターの値が null である場合は、エラーがスローされます。

次のコードは、前に示した FileReference.load() メソッドの例を拡張したものです。ファイルからデータを読み取った後、この例ではユーザーにファイル名の入力を求め、新しいファイルにデータを保存します。

package 
{ 
    import flash.display.Sprite; 
    import flash.events.*;  
    import flash.net.FileFilter; 
    import flash.net.FileReference; 
    import flash.net.URLRequest; 
    import flash.utils.ByteArray; 
 
    public class FileReferenceExample2 extends Sprite 
    { 
        private var fileRef:FileReference; 
        public function FileReferenceExample2() 
        { 
            fileRef = new FileReference(); 
            fileRef.addEventListener(Event.SELECT, onFileSelected); 
            fileRef.addEventListener(Event.CANCEL, onCancel); 
            fileRef.addEventListener(IOErrorEvent.IO_ERROR, onIOError); 
            fileRef.addEventListener(SecurityErrorEvent.SECURITY_ERROR, 
                        onSecurityError); 
            var textTypeFilter:FileFilter = new FileFilter("Text Files (*.txt, *.rtf)", 
                        "*.txt;*.rtf"); 
            fileRef.browse([textTypeFilter]); 
        } 
        public function onFileSelected(evt:Event):void 
        { 
            fileRef.addEventListener(ProgressEvent.PROGRESS, onProgress); 
            fileRef.addEventListener(Event.COMPLETE, onComplete); 
            fileRef.load(); 
        } 
 
        public function onProgress(evt:ProgressEvent):void 
        { 
            trace("Loaded " + evt.bytesLoaded + " of " + evt.bytesTotal + " bytes."); 
        } 
        public function onCancel(evt:Event):void 
        { 
            trace("The browse request was canceled by the user."); 
        } 
        public function onComplete(evt:Event):void 
        { 
            trace("File was successfully loaded."); 
            fileRef.removeEventListener(Event.SELECT, onFileSelected); 
            fileRef.removeEventListener(ProgressEvent.PROGRESS, onProgress); 
            fileRef.removeEventListener(Event.COMPLETE, onComplete); 
            fileRef.removeEventListener(Event.CANCEL, onCancel); 
            saveFile(); 
        } 
        public function saveFile():void 
        { 
            fileRef.addEventListener(Event.SELECT, onSaveFileSelected); 
            fileRef.save(fileRef.data,"NewFileName.txt"); 
        } 
 
        public function onSaveFileSelected(evt:Event):void 
        { 
            fileRef.addEventListener(ProgressEvent.PROGRESS, onSaveProgress); 
            fileRef.addEventListener(Event.COMPLETE, onSaveComplete); 
            fileRef.addEventListener(Event.CANCEL, onSaveCancel); 
        } 
 
        public function onSaveProgress(evt:ProgressEvent):void 
        { 
            trace("Saved " + evt.bytesLoaded + " of " + evt.bytesTotal + " bytes."); 
        } 
         
        public function onSaveComplete(evt:Event):void 
        { 
            trace("File saved."); 
            fileRef.removeEventListener(Event.SELECT, onSaveFileSelected); 
            fileRef.removeEventListener(ProgressEvent.PROGRESS, onSaveProgress); 
            fileRef.removeEventListener(Event.COMPLETE, onSaveComplete); 
            fileRef.removeEventListener(Event.CANCEL, onSaveCancel); 
        } 
 
        public function onSaveCancel(evt:Event):void 
        { 
            trace("The save request was canceled by the user."); 
        } 
 
        public function onIOError(evt:IOErrorEvent):void 
        { 
            trace("There was an IO Error."); 
        } 
        public function onSecurityError(evt:Event):void 
        { 
            trace("There was a security error."); 
        } 
    } 
}

すべてのデータがファイルから読み込まれると、 onComplete() メソッドが呼び出されます。 onComplete() メソッドによってロードイベントのリスナーが削除され、 saveFile() メソッドが呼び出されます。 saveFile() メソッドは、 FileReference.save() メソッドを呼び出します。 FileReference.save() メソッドは、新しいファイル名とファイル保存場所の入力をユーザーに求める新しいダイアログボックスを開きます。他のイベントリスナーメソッドは、ファイル保存プロセスの処理が完了するまで進行状況をトレースします。

Adobe AIR の FileStream クラスには、ローカルファイルにデータを書き込むための機能が用意されています。 ファイルの読み取りと書き込み を参照してください。

サーバーへのファイルのアップロード

サーバーにファイルをアップロードするには、まず browse() メソッドを呼び出して、ユーザーがファイルを選択できるようにします。次に、 FileReference.upload() メソッドが呼び出されると、選択したファイルがサーバーに転送されます。ユーザーが FileReferenceList.browse() メソッドで複数のファイルを選択した場合は、それらのファイルを示す FileReferenceList.fileList という配列が作成されます。その後、 FileReference.upload() メソッドを使用して、各ファイルを個別にアップロードします。

注意: FileReference.browse() メソッドを使用する場合は、ファイルを 1 つだけアップロードできます。複数のファイルをアップロードできるようにするには、 FileReferenceList.browse() メソッドを使用します。

デフォルトでは、ユーザーはシステムのファイルピッカーダイアログボックスを使用して、ローカルコンピューター上にある任意のタイプのファイルを選択できます。次のように FileFilter クラスを使用してファイルタイプのフィルターを作成し、 browse() メソッドでファイルフィルターインスタンスの配列を指定することによって、選択できるファイルを限定することもできます。

var imageTypes:FileFilter = new FileFilter("Images (*.jpg, *.jpeg, *.gif, *.png)", "*.jpg; *.jpeg; *.gif; *.png"); 
var textTypes:FileFilter = new FileFilter("Text Files (*.txt, *.rtf)", "*.txt; *.rtf"); 
var allTypes:Array = new Array(imageTypes, textTypes); 
var fileRef:FileReference = new FileReference(); 
fileRef.browse(allTypes);

ユーザーがシステムのファイルピッカーでファイルを選択し、「開く」ボタンをクリックすると、 Event.SELECT イベントが送出されます。 FileReference.browse() メソッドを使用して、アップロードするファイルを選択する場合は、次のコードで Web サーバーにファイルを送信します。

var fileRef:FileReference = new FileReference(); 
fileRef.addEventListener(Event.SELECT, selectHandler); 
fileRef.addEventListener(Event.COMPLETE, completeHandler); 
try 
{ 
    var success:Boolean = fileRef.browse(); 
} 
catch (error:Error) 
{ 
    trace("Unable to browse for files."); 
} 
function selectHandler(event:Event):void 
{ 
    var request:URLRequest = new URLRequest("http://www.[yourdomain].com/fileUploadScript.cfm") 
    try 
    { 
        fileRef.upload(request); 
    } 
    catch (error:Error) 
    { 
        trace("Unable to upload file."); 
    } 
} 
function completeHandler(event:Event):void 
{ 
    trace("uploaded"); 
}
FileReference.upload() メソッドでは、 URLRequest.method プロパティおよび URLRequest.data プロパティを使用し、 POST メソッドまたは GET メソッドで変数のデータをサーバーに送信できます。

FileReference.upload() メソッドを使用してファイルをアップロードしようとすると、次のイベントが送出されます。

  • open イベント( Event.OPEN ):アップロード処理が開始したときに送出されます。

  • progress イベント( ProgressEvent.PROGRESS ):ファイルのデータバイトがアップロードされると定期的に送出されます。

  • complete イベント( Event.COMPLETE ):ファイルのアップロード処理が正常に完了したときに送出されます。

  • httpStatus イベント( HTTPStatusEvent.HTTP_STATUS ):HTTP エラーが原因でアップロード処理が失敗した場合に送出されます。

  • httpResponseStatus イベント( HTTPStatusEvent.HTTP_RESPONSE_STATUS ): upload() または uploadUnencoded() メソッドを呼び出して HTTP を介してデータにアクセスを試み、Adobe AIR で要求のステータスコードを検出して返すことができる場合に送出されます。

  • securityError イベント( SecurityErrorEvent.SECURITY_ERROR ):セキュリティ侵害が原因でアップロード処理が失敗した場合に送出されます。

  • uploadCompleteData イベント( DataEvent.UPLOAD_COMPLETE_DATA ):アップロードの正常終了後、サーバーからデータを受信したときに送出されます。

  • ioError イベント( IOErrorEvent.IO_ERROR ):次のいずれかの原因でアップロードが失敗した場合に送出されます。

    • Flash Player によるファイルの読み込み中、書き込み中、または転送中に入出力エラーが発生した場合。

    • SWF ファイルが、認証(例 : ユーザー名とパスワード)を必要とするサーバーにファイルをアップロードしようとした場合。 Flash Player には、アップロード時にユーザーがパスワードを入力する手段が用意されていません。

    • url パラメーターに無効なプロトコルが指定されている場合。 FileReference.upload() メソッドでは、HTTP または HTTPS を使用する必要があります。

認証を必要とするサーバーに対する Flash Player のサポートは完全ではありません。 認証用のユーザー名とパスワードを入力するダイアログボックスは、ブラウザープラグインまたは Microsoft ActiveX® コントロールを使用してブラウザー上で実行される SWF ファイルにおいて、ダウンロードを実行する場合にのみ表示できます。プラグインまたは ActiveX コントロールを使用する場合のアップロードと、スタンドアローン Player または外部 Player を使用する場合のアップロードおよびダウンロードでは、ファイル転送に失敗します。

Flash Player によるファイルのアップロードを受け付けるサーバースクリプトを ColdFusion で作成する場合は、次のようなコードを使用します。

<cffile action="upload" filefield="Filedata" destination="#ExpandPath('./')#" nameconflict="OVERWRITE" />

この ColdFusion コードでは、Flash Player から送信されたファイルをアップロードし、ColdFusion テンプレートと同じディレクトリに保存します。同じ名前のファイルが既に存在する場合は上書きされます。 このコードではファイルのアップロードに必要な最低限の処理しか行っていないため、実際の運用環境ではこのスクリプトを使用しないでください。 データ検証のコードを付け加えて、特定のファイルタイプ(イメージなど)についてのみアップロードを許可し、サーバーサイドスクリプトなど危険が生じる可能性のあるファイルを受け付けないようにすることをお勧めします。

次のコードは PHP によるファイルのアップロード処理の例で、データ検証も実行します。 このスクリプトでは、アップロード先ディレクトリにアップロードするファイルの数を 10 個まで、ファイルサイズを 200 KB までに制限し、しかも、JPEG、GIF、PNG のいずれかのファイルだけをアップロードしてファイルシステムに保存できるようにしています。

<?php 
$MAXIMUM_FILESIZE = 1024 * 200; // 200KB 
$MAXIMUM_FILE_COUNT = 10; // keep maximum 10 files on server 
echo exif_imagetype($_FILES['Filedata']); 
if ($_FILES['Filedata']['size'] <= $MAXIMUM_FILESIZE) 
{ 
    move_uploaded_file($_FILES['Filedata']['tmp_name'], "./temporary/".$_FILES['Filedata']['name']); 
    $type = exif_imagetype("./temporary/".$_FILES['Filedata']['name']); 
    if ($type == 1 || $type == 2 || $type == 3) 
    { 
        rename("./temporary/".$_FILES['Filedata']['name'], "./images/".$_FILES['Filedata']['name']); 
    } 
    else 
    { 
        unlink("./temporary/".$_FILES['Filedata']['name']); 
    } 
} 
$directory = opendir('./images/'); 
$files = array(); 
while ($file = readdir($directory)) 
{ 
    array_push($files, array('./images/'.$file, filectime('./images/'.$file))); 
} 
usort($files, sorter); 
if (count($files) > $MAXIMUM_FILE_COUNT) 
{ 
    $files_to_delete = array_splice($files, 0, count($files) - $MAXIMUM_FILE_COUNT); 
    for ($i = 0; $i < count($files_to_delete); $i++) 
    { 
        unlink($files_to_delete[$i][0]); 
    } 
} 
print_r($files); 
closedir($directory); 
 
function sorter($a, $b) 
{ 
    if ($a[1] == $b[1]) 
    { 
        return 0; 
    } 
    else 
    { 
        return ($a[1] < $b[1]) ? -1 : 1; 
    } 
} 
?>

このアップロードスクリプトには、 POST または GET リクエストメソッドを使用して追加の変数を渡すこともできます。追加の POST 変数をアップロードスクリプトに送信するには、次のようなコードを使用します。

var fileRef:FileReference = new FileReference(); 
fileRef.addEventListener(Event.SELECT, selectHandler); 
fileRef.addEventListener(Event.COMPLETE, completeHandler); 
fileRef.browse(); 
function selectHandler(event:Event):void 
{ 
    var params:URLVariables = new URLVariables(); 
    params.date = new Date(); 
    params.ssid = "94103-1394-2345"; 
    var request:URLRequest = new URLRequest("http://www.yourdomain.com/FileReferenceUpload/fileupload.cfm"); 
    request.method = URLRequestMethod.POST; 
    request.data = params; 
    fileRef.upload(request, "Custom1"); 
} 
function completeHandler(event:Event):void 
{ 
    trace("uploaded"); 
}

上記の例では、URLVariables オブジェクトを作成してリモートのサーバーサイドスクリプトに送信しています。ActionScript の以前のバージョンでは、変数をサーバーアップロードスクリプトに送信するには値をクエリ文字列に含めて渡す必要がありました。 ActionScript 3.0 では、URLRequest オブジェクトを使用して POST または GET メソッドで変数をリモートスクリプトに送信できます。そのため、データのセット数が多い場合でも容易かつ簡潔に送信処理を記述できるようになりました。変数の受け渡しに使用する GET または POST リクエストメソッドを指定するには、 URLRequest.method プロパティを URLRequestMethod.GET (GET メソッドの場合)または URLRequestMethod.POST (POST メソッドの場合)に設定します。

また、ActionScript 3.0 では、 upload() メソッドに 2 番目のパラメーターを指定することで、デフォルトの Filedata アップロードファイルフィールド名を変更できます。前のコード例では、この操作の例としてデフォルト値の Filedata Custom1 に置き換えています。

Flash Player のデフォルトではテストアップロードが試行されませんが、 upload() メソッドの 3 番目のパラメーターに値 true を指定するとこの動作を変更できます。テストアップロードの目的は、実際のファイルアップロードを正常に実行できるかどうか試すことと、(認証が必要な場合に) 認証を通過できるかどうか確認することです。

注意: テストアップロードは、現在のところ Windows 版の各種 Flash Player でのみ実行されます。

ファイルのアップロードを処理するサーバースクリプトは、次の要素を含んでいる HTTP POST リクエストを受け付ける必要があります。

  • Content-Type :値として multipart/form-data が設定されています。

  • Content-Disposition name 属性が " Filedata "、 filename 属性が元のファイルの名前に設定されています。 FileReference.upload() メソッドの uploadDataFieldName パラメーターに値を指定すると、 name 属性に独自の値を指定できます。

  • ファイルの内容を表すバイナリデータ。

HTTP POST リクエストの例を次に示します。

POST /handler.asp HTTP/1.1 
Accept: text/* 
Content-Type: multipart/form-data; 
boundary=----------Ij5ae0ae0KM7GI3KM7ei4cH2ei4gL6 
User-Agent: Shockwave Flash 
Host: www.mydomain.com 
Content-Length: 421 
Connection: Keep-Alive 
Cache-Control: no-cache 
 
------------Ij5ae0ae0KM7GI3KM7ei4cH2ei4gL6  
Content-Disposition: form-data; name="Filename" 
 
sushi.jpg  
------------Ij5ae0ae0KM7GI3KM7ei4cH2ei4gL6 
Content-Disposition: form-data; name="Filedata"; filename="sushi.jpg" 
Content-Type: application/octet-stream 
 
Test File  
------------Ij5ae0ae0KM7GI3KM7ei4cH2ei4gL6 
Content-Disposition: form-data; name="Upload" 
 
Submit Query 
------------Ij5ae0ae0KM7GI3KM7ei4cH2ei4gL6 
(actual file data,,,)

次に示すサンプルの HTTP POST 要求は、 api_sig api_key auth_token の 3 つの POST 変数を送信します。この例では、カスタムアップロードデータフィールド名の値は "photo" です。

POST /handler.asp HTTP/1.1 
Accept: text/* 
Content-Type: multipart/form-data; 
boundary=----------Ij5ae0ae0KM7GI3KM7ei4cH2ei4gL6 
User-Agent: Shockwave Flash 
Host: www.mydomain.com 
Content-Length: 421 
Connection: Keep-Alive 
Cache-Control: no-cache 
 
------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7 
Content-Disposition: form-data; name="Filename" 
 
sushi.jpg 
------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7 
Content-Disposition: form-data; name="api_sig" 
 
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 
------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7 
Content-Disposition: form-data; name="api_key" 
 
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 
------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7 
Content-Disposition: form-data; name="auth_token" 
 
XXXXXXXXXXXXXXXXXXXXXXX 
------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7 
Content-Disposition: form-data; name="photo"; filename="sushi.jpg" 
Content-Type: application/octet-stream 
 
(actual file data,,,) 
------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7 
Content-Disposition: form-data; name="Upload" 
 
Submit Query 
------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7--

サーバーからのファイルのダウンロード

FileReference.download() メソッドを使用すると、サーバー上のファイルをユーザーがダウンロードできます。このメソッドには、 request および defaultFileName の 2 つのパラメーターがあります。第 1 パラメーターには、ダウンロードするファイルの URL を表す URLRequest オブジェクトを指定します。 第 2 パラメーターはオプションです。ダウンロードファイルのダイアログボックスに表示されるデフォルトのファイル名を指定できます。2 番目のパラメーターの defaultFileName を省略すると、指定した URL に含まれているファイル名が使用されます。

次のコードでは、SWF ファイルと同じディレクトリから index.xml というファイルをダウンロードします。

var request:URLRequest = new URLRequest("index.xml"); 
var fileRef:FileReference = new FileReference(); 
fileRef.download(request);

デフォルトの名前を index.xml ではなく currentnews.xml に設定するには、次のコードのように defaultFileName パラメーターを指定します。

var request:URLRequest = new URLRequest("index.xml"); 
var fileToDownload:FileReference = new FileReference(); 
fileToDownload.download(request, "currentnews.xml");

サーバーにあるファイルに意味のわかりにくい名前が付いている場合や、ファイル名がサーバーで自動生成される場合、ファイル名の変更は役立ちます。また、ファイルを直接ダウンロードするのではなくサーバーサイドスクリプトを使用してダウンロードする場合も、 defaultFileName パラメーターを明示的に指定することをお勧めします。例えば、指定した URL 変数に基づいて特定のファイルをダウンロードするようなサーバーサイドスクリプトに対しては、 defaultFileName パラメーターを指定する必要があります。指定しない場合、ダウンロードするファイルのデフォルトの名前はサーバーサイドスクリプトの名前と同じになります。

データ解析用サーバースクリプトを表す URL にパラメーターを追加すると、 download() メソッドを使用してサーバーにデータを送信できます。次の ActionScript 3.0 コードでは、ColdFusion スクリプトに渡すパラメーターに基づいてドキュメントをダウンロードします。

package 
{ 
    import flash.display.Sprite; 
    import flash.net.FileReference; 
    import flash.net.URLRequest; 
    import flash.net.URLRequestMethod; 
    import flash.net.URLVariables; 
 
    public class DownloadFileExample extends Sprite 
    { 
        private var fileToDownload:FileReference; 
        public function DownloadFileExample() 
        { 
            var request:URLRequest = new URLRequest(); 
            request.url = "http://www.[yourdomain].com/downloadfile.cfm"; 
            request.method = URLRequestMethod.GET; 
            request.data = new URLVariables("id=2"); 
            fileToDownload = new FileReference(); 
            try 
            { 
                fileToDownload.download(request, "file2.txt"); 
            } 
            catch (error:Error) 
            { 
                trace("Unable to download file."); 
            } 
        } 
    } 
}

次のコードは "download.cfm" という ColdFusion スクリプトの例です。URL 変数の値に応じて、サーバー上にある 2 つのファイルのうちいずれかをダウンロードします。

<cfparam name="URL.id" default="1" /> 
<cfswitch expression="#URL.id#"> 
    <cfcase value="2"> 
        <cfcontent type="text/plain" file="#ExpandPath('two.txt')#" deletefile="No" /> 
    </cfcase> 
    <cfdefaultcase> 
        <cfcontent type="text/plain" file="#ExpandPath('one.txt')#" deletefile="No" /> 
    </cfdefaultcase> 
</cfswitch>

FileReferenceList クラス

FileReferenceList クラスを使用すると、サーバーサイドスクリプトにアップロードするファイルをユーザーが指定できます。 ファイルのアップロードについては、ユーザーが選択した個々のファイルに対して FileReference.upload() メソッドを呼び出すことによって処理する必要があります。

次のコードでは、2 つの FileFilter オブジェクト( imageFilter および textFilter )を作成し、それらを配列として FileReferenceList.browse() メソッドに渡しています。これにより、OS のファイルダイアログボックスにはファイルタイプを指定するフィルターが 2 つ表示されます。

var imageFilter:FileFilter = new FileFilter("Image Files (*.jpg, *.jpeg, *.gif, *.png)", "*.jpg; *.jpeg; *.gif; *.png"); 
var textFilter:FileFilter = new FileFilter("Text Files (*.txt, *.rtf)", "*.txt; *.rtf"); 
var fileRefList:FileReferenceList = new FileReferenceList(); 
try 
{ 
    var success:Boolean = fileRefList.browse(new Array(imageFilter, textFilter)); 
} 
catch (error:Error)  
{ 
    trace("Unable to browse for files."); 
}

FileReferenceList クラスを使用して複数のファイルを選択およびアップロードできるようにする場合も、ファイルの選択は FileReference.browse() と同様に行いますが、複数のファイルを選択できる点が異なります。複数のファイルをアップロードする際は、次のコードのように FileReference.upload() を使用して、選択した個々のファイルをアップロードする必要があります。

var fileRefList:FileReferenceList = new FileReferenceList(); 
fileRefList.addEventListener(Event.SELECT, selectHandler); 
fileRefList.browse(); 
 
function selectHandler(event:Event):void 
{ 
    var request:URLRequest = new URLRequest("http://www.[yourdomain].com/fileUploadScript.cfm"); 
    var file:FileReference; 
    var files:FileReferenceList = FileReferenceList(event.target); 
    var selectedFileArray:Array = files.fileList; 
    for (var i:uint = 0; i < selectedFileArray.length; i++) 
    { 
        file = FileReference(selectedFileArray[i]); 
        file.addEventListener(Event.COMPLETE, completeHandler); 
        try 
        { 
            file.upload(request); 
        } 
        catch (error:Error) 
        { 
            trace("Unable to upload files."); 
        } 
    } 
} 
function completeHandler(event:Event):void 
{ 
    trace("uploaded"); 
}

配列内の各 FileReference オブジェクトに Event.COMPLETE イベントが追加されているので、各ファイルのアップロードが完了するたびに、Flash Player によって completeHandler() メソッドが呼び出されます。