最新のPHPニュース
IFRAMEを使って非同期にファイルをアップロードするサンプル
anyExample.comにて、PHPを用いて作成したIFRAME & JavaScriptによるファイルアップロードのサンプルスクリプトが掲載されています。
通常、Ajax(XMLHttpRequest)を使用して<input type="file">によるファイル送信はできませんが、IFRAMEをうまく活用することで非同期ファイルアップロードが可能になります。
このスクリプトの基本的な構成は以下の通りです。
IFRAMEを設置し、style="display:none;"で非表示にしておきます。
<input type="file"...>を含むフォームを設置し、そのターゲットにIFRAMEのnameを指定する。このinputフィールドのonchangeイベントでファイル拡張子をチェックし、JavaScriptのsubmit()で、ファイル送信を行います。
IFRAME側では、アップロード完了後に親フレームのHTML要素をJavaScriptで書き換えてやることで、ユーザーにアップロードの完了を通知しています。
また、このスクリプトではアップロードしたファイルのログや、ダウンロード用のインフォメーションページも作成してくれます。
使用方法ですが、ファイルを設置しアップロード先のディレクトリを作成します。そして、以下の2点を各自の環境に合わせるだけです。
$upload_dir = "/var/www/anyexample/aeu"; //アップロードするディレクトリ
$web_upload_dir = "/aeu"; //上記ディレクトリのウェブ上からのURL
以下、スクリプトのサンプルです。
1<?php23$upload_dir = 'C:\data\public_html\up'; //ファイルをアップロードするディレクトリ4$web_upload_dir = "/up"; //上記ディレクトリのwebからアクセスする際のURL56$tf = $upload_dir.'/'.md5(rand()).".test";7$f = @fopen($tf, "w");89if ($f == false) {10die("Fatal error! {$upload_dir} is not writable. Set 'chmod 777 {$upload_dir}' or something like this");11}1213fclose($f);14unlink($tf);1516//IFRAME用処理17if (isset($_POST['fileframe'])) {18$result = 'ERROR';19$result_msg = 'No FILE field found';2021//アップロード処理22if (isset($_FILES['file'])) {23if ($_FILES['file']['error'] == UPLOAD_ERR_OK){24$filename = $_FILES['file']['name'];25move_uploaded_file($_FILES['file']['tmp_name'], $upload_dir.'/'.$filename);26$result = 'OK';27} elseif ($_FILES['file']['error'] == UPLOAD_ERR_INI_SIZE) {28$result_msg = 'The uploaded file exceeds the upload_max_filesize directive in php.ini';29} else {30$result_msg = 'Unknown error';31}32}3334//IFAMEに出力するHTML35echo '<html><head><title>-</title></head><body>';36echo '<script language="JavaScript" type="text/javascript">'."\n";37//親フレーム要素を操作するJavaScript38echo 'var parDoc = window.parent.document;';39if ($result == 'OK') {40echo 'parDoc.getElementById("upload_status").value = "file successfully uploaded";';41echo 'parDoc.getElementById("filename").value = "'.$filename.'";';42echo 'parDoc.getElementById("filenamei").value = "'.$filename.'";';43echo 'parDoc.getElementById("upload_button").disabled = false;';44} else {45echo 'parDoc.getElementById("upload_status").value = "ERROR: '.$result_msg.'";';46}4748echo "\n".'</script>now uploading!!</body></html>';49exit();50}5152//アップロード後の説明ファイル作成53if (isset($_POST['description'])) {54$filename = $_POST['filename'];55$size = filesize($upload_dir.'/'.$filename);56$date = date('r', filemtime($upload_dir.'/'.$filename));57$description = htmlspecialchars($_POST['description']);585960//説明用ファイル作成61$html =<<<END62<html><head><title>{$filename} [アップロード完了 by IFRAME 非同期ファイルアップローダー]</title></head>63<body>64<h1>{$filename}</h1>65<p>アップロードファイル情報ページ</p>66<p>Date: {$date}</p>67<p>Size: {$size} bytes</p>68<p>Description:69<pre>{$description}</pre>70</p>71<p><a href="{$web_upload_dir}/{$filename}" style="font-size: large;">ダウンロード</a><br>72<a href="{$PHP_SELF}" style="font-size: small;">アップロード画面に戻る</a><br>73<a href="{$web_upload_dir}/upload-log.html" style="font-size: small;">アップロードログ</a></p>74</body>75</html>76END;7778$f = fopen($upload_dir.'/'.$filename.'-desc.html', "w");79fwrite($f, $html);80fclose($f);81$msg = "File {$filename} アップロード完了, <a href='{$web_upload_dir}/{$filename}-desc.html'>インフォメーションページへ</a>";8283//アップロードログ追記84$f = fopen($upload_dir."/upload-log.html", "a");85fwrite($f, "<p>$msg</p>\n");86fclose($f);87}8889?>90<html>91<head>92<title>IFRAME 非同期 ファイルアップローダー サンプル</title>93</head>94<body>95<?php96if (isset($msg)) {97echo '<p style="font-weight: bold;">'.$msg.'</p>';98}99?>100<h1>アップロード ファイル:</h1>101102<form action="<?=$PHP_SELF?>" target="upload_iframe" method="post" enctype="multipart/form-data">103<input type="hidden" name="fileframe" value="true">104<label for="file">ファイル選択:</label> <input type="file" name="file" id="file" onChange="jsUpload(this)">105</form>106107<script type="text/javascript">108function jsUpload(upload_field) {109110var re_text = /\.txt|\.xml|\.zip/i;111var filename = upload_field.value;112//許可ファイル判定113if (filename.search(re_text) == -1) {114alert("File does not have text(txt, xml, zip) extension");115upload_field.form.reset();116return false;117}118119upload_field.form.submit();//ファイルを送信120document.getElementById('upload_status').value = "uploading file...";121upload_field.disabled = true;122return true;123}124</script>125126<!-- このフレームはアップロード用で表示はしないようにする -->127<iframe name="upload_iframe" style="width: 400px; height: 100px; display: none;"></iframe><br>128129<!-- これは表示用 -->130ステータス:<input type="text" name="upload_status" id="upload_status" value="not uploaded" size="64" disabled><br />131ファイル名:<input type="text" name="filenamei" id="filenamei" value="none" disabled>132133<!-- 説明文用 -->134<form action="<?=$PHP_SELF?>" method="POST">135<input type="hidden" name="filename" id="filename"><br><br>136<label for="photo">ファイル説明:</label><br>137<textarea rows="5" cols="50" name="description"></textarea><br><br>138<input type="submit" id="upload_button" value="save file" disabled>139</form>140141<p><a href="<?=$web_upload_dir?>/upload-log.html?t=<?=time()?>">アップロードログ</a></p>142143</body>144</html>
関連リンク
この記事へのトラックバックURL
>> ニュースの一覧へ戻る





