dedecms 后台不能上传图片的缘由不少了,可是这两个是很难发现,并且在本地测试还很正常,当初我想不来为何上传不了图片,只好暂时使用ftp直接上传到空间,而后再使用在线浏览,选择图片加入,即便加入有时还会生成不了缩略图,,如下只说明两个缘由:php
1:主机空间商使用了反向代理服务器,致使上生成不了缩略图,这个只是针对使用的是远程图片那种,相似下面这种html
dedecms后台提交时就会看成远程的图片来处理,下面咱们来看看dedecms怎么处理一个远程图片的根据当前的页面地址咱们能够知道使用的php文件是哪个,数组
再找analysehtmlBody函数,浏览器
找到如下行
服务器
为何要改写url变量,就是由于代理服务器把地址映射到其它的服务器上,致使不能直接使用原来那个图片的地址,天然获取不到图片,那么如何获取这个代理服务器节点,打开火狐浏览器的firebug中的网络栏就能够看到网络
注意:添加代理服务器节点时要根据本身的状况而定curl
2:服务器端禁用了fsockopen函数,这个可使用curl来替代fsockopen函数下面给出一个dedecms的解决方案ide
/** * curl获取一个远程图片 * 使用curl * @access public * @param string $url 地址 * @param int $uid 用户id * @return array */ function GetRemoteImage($url, $uid=0) { $url=substr_replace($url,'http://www.hteay.cn.img.800cdn.com/',0,20);//添加代理服务器节点的链接 global $cfg_basedir, $cfg_p_w_picpath_dir, $cfg_addon_savetype; //声明全局变量 $cfg_uploaddir = $cfg_p_w_picpath_dir; //上传目录 $revalues = Array(); //定义一个数组 $strpos=strrpos($url, '.'); $itype=substr($url,$strpos); $imgUrl = $cfg_uploaddir.'/'.MyDate($cfg_addon_savetype, time());//设置上传的文件的绝对位置 $imgPath = $cfg_basedir.$imgUrl; //设置图片的文件的相对路径 CreateDir($imgUrl);//建立目录 $rndname = dd2char($uid.'_'.MyDate('mdHis',time()).mt_rand(1000,9999));//产生一个随机数 $rndtrueName = $imgPath.'/'.$rndname.$itype;//设置名称 $fileurl = $imgUrl.'/'.$rndname.$itype;//文件路径 $ch=curl_init(); //初始化curl $fp = fopen($rndtrueName,'wb'); //打开文件:为移植性考虑,强烈建议在用 fopen() 打开文件时老是使用 'b' 标记 curl_setopt($ch, CURLOPT_URL, $url); //设置curl的url curl_setopt($ch,CURLOPT_FILE,$fp); //设置输出文件的位置,值是一个资源类型,默认为STDOUT (浏览器)。 curl_setopt($ch,CURLOPT_HEADER,0); //将http头部看成数据流输出 curl_setopt($ch,CURLOPT_TIMEOUT,60); //设置url容许运行的秒数 curl_exec($ch);//执行给定的cURL会话。 //这个函数应该在初始化一个cURL会话而且所有的选项都被设置后被调用。 curl_close($ch);//关闭curl会话 fclose($fp);//关闭文件指针 @WaterImg($rndtrueName, 'down'); //添加水印函数 $data = GetImageSize($rndtrueName); //获取文件的大小 $revalues[0] = $fileurl;//文件的路径 $revalues[1] = $data;//图片的宽 return $revalues; //返回文件的位置和大小的数组 }
由于个人主机使用了代理服务器因此有添加代理服务器节点,若是没有的直接删掉函数
转载自:www.myfreax.com
测试