iframeを使った非同期ファイルアップロードの実装

Ajaxってカテゴリー作って、最初に書くのが微妙に違うような話題。まぁ、広義のAjaxってことで。

Ajax系のシステムでファイルアップロードをする必要があっていろいろググってみたんだけど、あまり私のイメージにぴったりくる解説がないので、実装した結果をちょっとまとめてみました。

題材としてはタグを使ってアップロードするけど、ファイルが指定された時点でアップロードを実行してサムネールを表示、って感じのありがちな仕様。
手順を動作順に分けると
(1) (3)がアップロード結果を出力するiframe を準備
(2)ユーザが入力するフォーム上の
タグのonChangeイベントで、不可視にした(1)のiframeをtargetにしたsubmitを実行
(3)実行されたPHPスクリプトはファイルアップロード処理をしてiframeに出力(print)
(4)iframeのonLoadイベントで、親フォーム(ユーザー入力フォーム)にサムネール(必要ならその他情報)を表示
と大まかに書くとこんな手順。

実際のコード例
※ちょっとだけprototype.js を使用してます(これ無しでは生きられない体になってる)
(1)
< iframe name="upload_iframe" style="width:0px;height:0px;">

(2)
・フォーム
< form action="index.php" method="post" target="upload_iframe" enctype="multipart/form-data">
・ファイルタグ
< input type="file" onChange="showThumbNail(this);"/>
・スクリプト
function showThumbNail(self){
self.form.submit();
}

(3)iframeへの出力内容
  〔$_FILESのエラーチェック処理諸々〕
//正常終了
$wkHTML = < <<__HTML
<html>
< head>
< script type="text/javascript">
window.onload = function(){
parent.previewPhoto();
}

< body>
         ※出力する情報の一例
< input type="hidden" id="upload_preview" value=サムネールを表示するエレメント名 />
< input type="hidden" id="upload_rc" value=アップロード結果 />
< input type="hidden" id="upload_path" value=アップロードしたファイルの保存パス />

__HTML;
print($wkHTML);
</body>
</html>

(4)
function previewPhoto(){
if (async_upload_iframe.upload_rc.value == ‘OK’){
$(upload_iframe.upload_preview.value).src = upload_iframe.upload_path.value;
}
}

うーん、やっぱり非同期は処理が分散するから、分かりづらいな...
※なんかwordpressでソースコードを表示するやり方がよく分からないのでタグの最初を全角文字にしているのでこのままコピペしても使えません、なんで<pre>とか<code>とか効かないんだろう....

Comments are closed.