前话:
上传文件比较特殊,它不像form中其他,可以用jquery获取后用ajax更新,file文件的提交,必须要用form submit 提交。当然也有一些其他的开源js来实现静默上传文件,但很麻烦,决定自己写一个用iframe实现静默上传文件。
前台HTML :
<iframe name="upload_iframe" style="display:none"></iframe>
<form name="upload_form" action="__URL__/upload" method="POST" enctype="multipart/form-data" target="upload_iframe">
<input id="fileToUpload" type="file" name="fileToUpload"/>
<input type="submit" id="buttonUpload" value="上传"/>
</form>
注意:1. 必须在在<form> 里面加上 enctype="multipart/form-data" 这个是让系统识别是在上传文件操作,否则,PHP后台$_FILES获取不到数据。
2. 必须在<input type='file' > 里面加上 name属性,name值任意取,否则,PHP后台$_FILES获取不到数据。
2. 必须在<form> 里面加上 target="upload_iframe" ,target的值是上面iframe 的name值,必须要加,这样当后台的数据反馈到前台的时候,就反馈到这个iframe里面了, 达到伪静态的目的。
点击“上传按钮,后就提交到__URL__upload PHP后台里去了。”
后台PHP :(采用的是Thinkphp框架开发的)
Public function upload() {
import("@.ORG.UploadFile");
$upload = new UploadFile();
$upload->maxSize = 3145728; // 设置附件上传大小
$upload->allowExts = array('exe'); //只允许exe格式的附件
$upload->savePath = C('FILE_UPLOAD_DIR'); // 设置附件上传目录
if (!$upload->upload()) {// 上传错误提示错误信息
echo "<script>window.parent.alert('".$upload->getErrorMsg()."');</script>";
}
else {// 上传成功。并写入cook,供前台判断。
$info = $upload->getUploadFileInfo();
cookie('upload_file_url', $info[0]['savepath'], 100);
cookie('upload_file_name', $info[0]['name'], 100);
echo "<script>window.parent.alert('插件上传成功,请填写其他内容');window.parent.location.reload()</script>";
}
}
最重要的就是:echo "<script>window.parent.alert('".$upload->getErrorMsg()."');</script>"; 里面要弹框的是parent 。所以是window.parent.alert,parent一定要加。
OK .搞定!