画面遷移しないでファイルをアップロードするのは iframe を使うことで実現できる。
HTMLはこんな感じ。upload.html
<html>
<head>
<script type="text/javascript">
<!--
function uploaded(msg) {
document.getElementById('msg').innerHTML=msg;
}
//-->
</script>
<title>upload test</title>
</head>
<body>
何かの編集ページとか
<iframe name="uploader" src="" style="width:0px;height:0px;border:0px;"></iframe>
<form target="uploader" method="POST" action="uploader.php" enctype="multipart/form-data">
<input type="file" name="f"/><br/>
<input type="submit" value="upload"/>
</form>
<div id="msg"></div>
</body>
ファイルアップロードのPHPスクリプトはこんな感じ。uploader.php
<?php
if (isset($_POST)) {
$base_dir='/tmp/';
$f=$_FILES['f'];
if (isset($f) and $f['name']) {
$file=$base_dir.$f;
if (move_uploaded_file($f['tmp_name'],$file)) {
$msg=$f['name'].'をアップロードしました。';
} else {
$msg='アップロードに失敗しました。';
}
} else {
$msg='ファイルが指定されていません。';
}
}
?>
<html><head>
<script type="text/javascript">
<!--
window.onload=function(){
if(window.parent) {
window.parent.uploaded('<? echo $msg ?>');
}
}
//-->
</script>
</head><body></body></html>
iframe の style に display:none; を指定するサンプルコードを見かけるが Safari の場合 display:none; だとファイルアップロードのスクリプトが新しいウインドウで走ってしまうので注意。
参考- ファイルアップロード : ここの例では display:none; を指定しているが上述の通り、指定すると Safari で iframeが認識されなくなってしまう。
- Business chat for groups: Campfire : チャットサービスだが、ファイルをアップロードするコードが参考になる。プログレスバーも実装している
groundwalker.com