サーバーにファイルをアップロードするには、まず
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--