dedecms 后台使用远程图片生成不了缩略图原因和解决方法

dedecms 后台不能上传图片的原因很多了,但是这两个是很难发现,而且在本地测试还很正常,当初我想不来为什么上传不了图片,只好暂时使用ftp直接上传到空间,然后再使用在线浏览,选择图片加入,即使加入有时还会生成不了缩略图,,以下只说明两个原因:

1:主机空间商使用了反向代理服务器,导致上生成不了缩略图,这个只是针对使用的是远程图片那种,类似下面这种

101439557.png

dedecms后台提交时就会当作远程的图片来处理,下面我们来看看dedecms怎么处理一个远程图片的根据当前的页面地址我们可以知道使用的php文件是哪一个,

102227907.png

102511723.png

再找analysehtmlBody函数,

102716984.png


找到以下行

103809190.png

为什么要改写url变量,就是因为代理服务器把地址映射到其它的服务器上,导致不能直接使用原来那个图片的地址,自然获取不到图片,那么如何获取这个代理服务器节点,打开火狐浏览器的firebug中的网络栏就可以看到

112304122.png

注意添加代理服务器节点时要根据自己的情况而定


2:服务器端禁用了fsockopen函数,这个可以使用curl来替代fsockopen函数下面给出一个dedecms的解决方案


/**
 * 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_image_dir, $cfg_addon_savetype; //声明全局变量
    $cfg_uploaddir = $cfg_image_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


你可能感兴趣的:(代理服务器,解决方案,dedecms,缩略图,火狐浏览器)