Discuz! X2 一键下载远程图片到本地功能分析

  • 时间:
  • 浏览:0
  • 来源:极速赛车平台-极速赛车网投平台_极速赛车投注平台
作者:匿名 hihi 来源:Discuz!技术论坛 浏览: 2011-12-7 17:49:07 字号:大 中 小

[摘要]Discuz!X2.0中在编辑器中新增加了一键下载远程图片到本地的功能,当发含高图片地址的主题或帖子时,就可不能能把图片下载到本地服务器了,本文就介绍下你你这种功能。

  刚刚,用户在论坛中发你这种图片,会有一次责是从其它的站点直接克隆qq好友好友内容过来,原先克隆qq好友好友过来的图片只是有一2个附件地址,保趋于稳定主题和帖子内容中,一旦其它站点开启防盗链或改动图片附件的文件夹位置,就会造成图片不可不能能正常显示甚至死链。并肩对站长当事人附件的管理也带来了麻烦,影响网站运行效果。Discuz!X2.0中在编辑器中新增加了一键下载远程图片到本地的功能,一般默认点击“高级”,在“word“下面会有有一2个按钮,发含高图片地址的主题或帖子时,按下你你这种按钮,就会把图片下载到本地服务器。下面介绍一下你你这种下载到本地服务器的过程。

  打开文件 source\module\forum\forum_ajax.php,大概320行:

elseif($_G['gp_action'] == 'downremoteimg') {

$_G['gp_message'] = dstripslashes($_G['gp_message']);

$_G['gp_message'] = str_replace(array("\r", "\n", "\r\n"), '', $_G['gp_message']);

preg_match_all("/\[img\]\s*([^\[\<\r\n]+?)\s*\[\/img\]|\[img=\d{1,4}[x|\,]\d{1,4}\]\s*([^\[\<\r\n]+?)\s*\[\/img\]/is", $_G['gp_message'], $image1, PREG_SET_ORDER);

preg_match_all("/\<img.+src=('|\"|)?(.*)(\\1)([\s].*)?\>/ismUe", $_G['gp_message'], $image2, PREG_SET_ORDER);

$temp = $aids = $existentimg = array();

  这段代码是对内容 $G_[‘gp_message’] 删除由 addslashes() 函数加进的反斜杠,str_replace替换换行符等,即还原文本;preg_match_all 是对文本中图片几种地址进行全局匹配,结果保趋于稳定 $image1、$ image2 中,初始化变量。

if(is_array($image1) && !empty($image1)) {

foreach($image1 as $value) {

$temp[] = array(

'0' => $value[0],

'1' => trim(!empty($value[1]) ? $value[1] : $value[2])

);

}

}

if(is_array($image2) && !empty($image2)) {

foreach($image2 as $value) {

$temp[] = array(

'0' => $value[0],

'1' => trim($value[2])

);

}

}

require_once libfile('class/image');

  这段是对匹配后的结果进行遍历赋值,并含高图片出理 类。

if(is_array($temp) && !empty($temp)) {

require_once libfile('class/upload');

$upload = new discuz_upload();

$attachaids = array();

foreach($temp as $value) {

…………………上面略去…………………

if(!@$fp = fopen($attach['target'], 'wb')) {

continue;

} else {

flock($fp, 2);

fwrite($fp, $content);

fclose($fp);

}

if(!$upload->get_image_info($attach['target'])) {

@unlink($attach['target']);

continue;

}

  你你这种段的目的是对下载下来的附件进行地址、图片信息、缩略图等进行出理 ,并写入文件保存,只是 判断是也有 图片,不可能 也有 ,则删除----unlink($attach['target']);。

$attach['size'] = filesize($attach['target']);

$upload->attach = $attach;

$thumb = $width = 0;

if($upload->attach['isimage']) {

…………………上面内容省略………………………

$aids[] = $aid = getattachnewaid();

$setarr = array(//得到图片附件相关信息

'aid' => $aid,

'dateline' => $_G['timestamp'],

'filename' => daddslashes($upload->attach['name']),

'filesize' => $upload->attach['size'],

'attachment' => $upload->attach['attachment'],

'isimage' => $upload->attach['isimage'],

'uid' => $_G['uid'],

'thumb' => $thumb,

'remote' => '0',

'width' => $width

);

DB::insert("forum_attachment_unused", $setarr);//入库

$attachaids[$hash] = $imagereplace['newimageurl'][] = '[attachimg]'.$aid.'[/attachimg]';

} else {

$imagereplace['newimageurl'][] = $attachaids[$hash];

}

  这段是把图片附件的信息进行出理 ,通过 getattachnewaid 函数把主题或帖子相关图片信息插入附件表。

if(!empty($aids)) {

require_once libfile('function/post');

ftpupload($aids);

}

$_G['gp_message'] = str_replace($imagereplace['oldimageurl'], $imagereplace['newimageurl'], $_G['gp_message']);

$_G['gp_message'] = addcslashes($_G['gp_message'], '/"\\');

}

  最后这段只是真正把图片附件上传到当事人本地服务器,并将文本再 addcslashes 出理 。

Discuz 下载:

sssss
Tags: Discuz   Discuz! X2   Discuz使用  
责任编辑:cc120