|
功能及特色:
远程图片本地化.
与discu附件系统相结合.
删除主题或者编辑主题附件将有效支持.
可配置水印及discu后台支持(原版控制)
权限控制(uid精准控制);
小图片智能替换(再也不会把细米小的图片也来本地化了)
单次减压设置. (考虑到虚拟主机及连接超时问题, 所以缩小远程个数)
插件安装非常简易, 仅一个文件解决.
安装方法
打开: viewthread.php文件(根目录)
查找:
while($post = $sdb->fetch_array($query)) {
复制代码
在它的下一行增加如下代码:
//配置开始:
$imgon = 1; //开启水印.
$minwidth = 100; //最小图片尺寸.
$minimg = '--'; //小图片替换成;
$img5 = 5; //几张图片远程一次?,如果服务器不稳定,或者其它问题请设置一张图片远程一次, 然后多刷新几次主题..
$ruid = array($post['first'] && $post['uid'],1); //使用者ID,第一个主题作者, 第二个是管理员,依次在后面加
//判断: 主题层/内容中函远程图片/用户权限
if($post['first']==='1' && strpos($post['message'],'[/img]')!==false && in_array($discuz_uid,$ruid)===true){
set_time_limit(0);
//当前附件目录
$mot = 'month_'.strtr(date('Ym',time()),array('20'=>''));
//绝对附件目录
$attpath = strtr($_DCACHE['settings']['attachdir'],array('./'=>'')).'/';
//判断附件目录是否存在
if(is_dir($attpath.$mot)===false)
@mkdir($attpath.$mot,0777);
//初始化
$imgarray = $imgarr = array();
$inid = null;
//正则出远程图片地址块,非记录地址,一定要块.
preg_match_all('/\[img(?:=.+)?\].+\[\/img\]/isU',$post['message'],$imgarray);
require_once DISCUZ_ROOT.'./include/image.class.php';
foreach ($imgarray[0] as $val){
//过滤掉前置.
$imgname = preg_replace(array('/\[img(?:=.+)?\]/isU','/\[\/img\]/isU'),'',$val);
//随机化图片名称: $filenamea 附件字段filename需要;
$filenamea = time().random(16).'.gif';
$filename = $mot.'/'.strtr($filenamea,array('//'=>'/'));
//写入目录,>=PHP5;
$file = @file_get_contents($imgname);
if(file_put_contents($attpath.$filename,$file)){ // 如果写入成功
//取得附件图片信息;
$info_r = @getimagesize($attpath.$filename);
//取得附件字节
$filesize = filesize($attpath.$filename);
//取得当前时间
$time = time();
//如果图片太小,就把那块段替换成其它字符.并且中断一次.
if($info_r[0] < $minwidth){
$post['message'] = &strtr($post['message'],array($val=>"$minimg"));
unlink($attpath.$filename);
continue;
}
//写入附件数据表.
$db->query("INSERT INTO `{$tablepre}attachments`
(tid,pid,width,dateline,filename,filetype,filesize,attachment,isimage,uid) VALUES
('{$post['tid']}','{$post['pid']}','{$info_r[0]}','$time','$filenamea','{$info_r['mime']}','$filesize','$filename','1','{$post['uid']}')");
//取得当前写入ID值.
$inid = $db->insert_id();
$imgarr[] = $inid;
//引用方式替换内容中的图片
$post['message'] = &strtr($post['message'],array($val=>"[attach]{$inid}[/attach]"));
//判断:水印开关/附件插入ID
if($imgon === 1 && $inid){ //水印
$image = new Image($attpath.$filename);
$image->Watermark();
}
if(count($imgarr)===$img5)
break;
}
//开始处理清除变量;
unset($info_r,$filesize);
}
//循环之外,如果有插入附件ID值,就将内容数据表更新, 并且设置附件attachment为1.
if(isset($inid)){
$db->query("UPDATE `{$tablepre}posts` SET `message` = '{$post['message']}',`attachment` = '1' WHERE `pid` ={$post['pid']} LIMIT 1 ;");
$db->query("UPDATE `{$tablepre}threads` SET `attachment` = '2' WHERE `tid` ={$post['tid']} LIMIT 1 ;");
}
}
//结束
复制代码
事实上, 插件就安装完成了, 配置文件,自己可以设置一下, 默认是管理员与当前主题作者可使用远程本地化.尽量多测试, 将问题及意见告诉我, 我会在线处理.
|
|