非同期ファイルのアップロードは頻繁に発生する問題であり、最新の AJAX 実装 Web アプリケーションでは解決する必要があります。ただし、AJAXの標準クラス(XmlHttpRequest)ではファイル転送の機能を実現できません。したがって、ここで説明するのは、AJAX テクノロジに基づいて非同期ファイル アップロード機能を構築する方法です。この機能では、ファイルを転送するために組み込みのフレームと (IFRAME) を使用する必要があります。この機能の効果は、ページがファイルをアップロードしているときに、ユーザーもそのページを使用してファイルの説明を入力できることです。
この例は、AJAX の古典的なケースを引用して分析されています。
システム環境
・ブラウザの新しいバージョン。たとえば、Opera、Firefox、Internet Explorer などです。
・PHP 4.3.0以降
・PHP 5バージョン
・PHPの「short_open_tag」オプションがオンになっています(そうしないと解析エラーが発生します)。
機能分析
組み込みの IFRAME (フレームワーク) を通じてファイルをアップロードします。 3 つの部分から構成されます。
・ページの中央に簡単なコントロールがあります。このフォームのターゲット リンクは非表示の IFRAME (CSS スタイル "display: none;" によって実装) であり、フォーム内の唯一のコントロールの OnChange イベントを使用して JavaScript 関数がトリガーされます。この機能の目的は、ユーザーが送信した拡張子を確認し、フォームを送信することです。
・サーバー側で処理プロセスをPHPで記述しました(FILEFRAMEでアノテーションを付けました)。このプロセスは、クライアントからアップロードされたファイルを確認し、サーバーに保存し、JavaScript コードの形式でユーザーに返すために使用されます。ユーザーに返される Javascript は、「parent.window.document」を介してユーザーが現在表示しているページを変更し、ファイル名を設定し、ユーザーがフォームを送信できるボタンを有効にします。ボタンを有効にする操作は、getElementById 関数を通じて実装されます。
・メインページにもフォームがあり、ユーザーが送信した説明と隠しファイル名が含まれています。ユーザーは、ファイルをアップロードするときにファイルの説明を入力できます。ファイルのアップロードが完了したら、ユーザーはボタンをクリックして、アップロード後にユーザーに返されたファイル情報を表示します。 (ファイル情報は、返されたファイル名とユーザーが入力した説明で構成されます)。
おそらく、この操作は不合理であると言うかもしれません。ユーザーが確認する前にファイルが送信されています。ユーザーが送信しない場合はどうなりますか。ユーザーが放棄したファイルは拡張機能内で自分で扱うことができます。
この例では、ファイル システム ディレクトリにファイルを保存します。このディレクトリ情報を含む特定の変数は、$upload_dir と $web_upload_dir です。スクリプトの実行を開始するときに、このディレクトリを構成する必要があります。ディレクトリが書き込み可能かどうかを確認するためのアクセス許可チェックがあります。
ここでは次のPHP関数を使用します:
· move_uploaded_file - サーバーにアップロードされたファイルを移動します
・ fopen - ファイルを開きます
・fwrite - コンテンツをファイルに書き込みます
・fclose - ファイルを閉じます
· str_replace - 文字列を置換します
· filesize - ファイルサイズを返します
· filemtime - 戻り処理時間
これらの機能の使用方法はマニュアルで確認できます。 HTM (<、>、&) タグを (<、>、&) に置き換えてください。
ソースコード
$upload_dir = "/var/www/anyexample/aeu" // ファイルが保存されているパス
;$web_upload_dir = "/aeu" // Webディレクトリ内のファイルのパス
;$tf = $upload_dir.'/'.md5(rand()).".test";
$f = @fopen($tf, "w");
if ($f == false)
die("致命的なエラー! {$upload_dir} は書き込み可能ではありません。「chmod 777 {$upload_dir}」を設定してください
またはこのようなもの");
fclose($f);
リンクを解除($tf);
//アップロードされたファイルを処理します
if (isset($_POST['fileframe']))
{
$result = 'エラー';
$result_msg = 'FILE フィールドが見つかりません';
if (isset($_FILES['file'])) // ブラウザからファイルを受け入れる
{
if ($_FILES['file']['error'] == UPLOAD_ERR_OK) // エラーなし
{
$filename = $_FILES['file']['name'] // ファイル名
;move_uploaded_file($_FILES['file']['tmp_name'], $upload_dir.'/'.$filename);
// 主な処理の流れ - $upload_dirにファイルを転送
$result = 'OK';
}
elseif ($_FILES['file']['error'] == UPLOAD_ERR_INI_SIZE)
$result_msg = 'アップロードされたファイルがphp.iniのupload_max_filesizeディレクティブを超えています';
その他
$result_msg = '不明なエラー';
}
エコー '';
エコー