话说今天下载了最新版的xheditor v1.0.0-rc3,用来更新在开发项目中的旧版xheditor,结果发现在编辑器中上传本地图片时总是失败。我使用ThinkPHP框架,处理上传文件的程序基于ThinkPHP的UploadFile.class.php,php程序报错是没有上传任何文件,我dump变量$_FILES,它确实也是空,一时不知所以然。
去看xheditor的demo,发现其处理上传文件的程序中有下面这样一段:
if(isset($_SERVER['HTTP_CONTENT_DISPOSITION']))//HTML5上传
{
if(preg_match('/attachment;\s+name="(.+?)";\s+filename="(.+?)"/i',$_SERVER['HTTP_CONTENT_DISPOSITION'],$info))
{
$temp_name=ini_get("upload_tmp_dir").'\\'.date("YmdHis").mt_rand(1000,9999).'.tmp';
file_put_contents($temp_name,file_get_contents("php://input"));
$size=filesize($temp_name);
$_FILES[$info[1]]=array(
'name'=>$info[2],
'tmp_name'=>$temp_name,
'size'=>$size,
'type'=>'',
'error'=>0
);}
}
原来新版的xheditor加入了部分HTML5特性,如果浏览器支持HMTL5,上传文件时会使用HTML5的新特性可以准确地显示文件上传的进度,而不需依靠常见的ajax或者flash来实现。而问题在于,这种形式上传的文件,与表单中POST上传的文件不同,不会在服务端生成$_FILES变量,所以demo中的upload.php就抓取了文件自行构造了一个$_FILES。一般来说接下来可以照一般的文件上传情况来进行处理了。但ThinkPHP的UploadFile.class.php在安全性检查上比较严格,使用了is_upload_file()函数检查文件是否是通过POST方式上传的,显然,上面我们自行构造的$_FILES是通不过检查的。随后还会使用move_uploaded_file()来保存被上传的文件,而这个函数本身也会对文件作验证,只对POST上传的文件有效,这个函数不知ThinkPHP用,我想大多数的PHP程序员都会使用它,所以xhedior的新功能在一般的PHP程序上就遇到了麻烦。
我已把这个问题向xheditor的作者yanis.wang做了反映,他说下个版本会考虑增加关闭HTML5功能的设置。
更新:xheditor的最新版本已经增加了关闭HTML5效果的设置,设置方法如下:
1.class初始化方式: class="xheditor {html5Upload:false}"
2.js初始化方式:$('#elem1').xheditor({html5Upload:false});
本博客文章非特别注明均属原创,如需转载请保留本博客地址:http://dao.daimaku.com
[