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 ではサポートされません。
FileReference クラス各 FileReference オブジェクトは、ローカルマシン上の 1 つのデータファイルを表します。FileReference クラスのプロパティには、ファイルのサイズ、種類、名前、ファイル拡張子、作成者、作成日および変更日の情報が含まれています。 注意: creator プロパティは Mac OS でのみサポートされており、それ以外のすべてのプラットフォームでは null が返されます。
注意: extension プロパティは Adobe AIR でのみサポートされています。
FileReference クラスのインスタンスを作成する方法は 2 種類あります。
FileReference オブジェクトを作成した後は、以下の操作を実行できます。
注意: browse()、download() または save() のアクションを複数並行して実行することはできません。これは、一度に 1 つしかダイアログボックスを表示できないからです。
name、size、modificationDate などの FileReference オブジェクトのプロパティは、以下のいずれかの操作が行われるまで定義されません。
注意: ダウンロードを実行する場合、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 オブジェクトからロードプロセス中に送出されるのは次のイベントです。
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 オブジェクトはファイル保存プロセスで以下のイベントを送出します。
ファイルにデータを書き込む方法は、次のように、FileReference.save() メソッドの data パラメーターに渡されるオブジェクトの型により決定されます。
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() メソッドを使用してファイルをアップロードしようとすると、次のイベントが送出されます。
認証を必要とするサーバーに対する 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 リクエストを受け付ける必要があります。
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() メソッドが呼び出されます。 |
|