Discuz!官方免费开源建站系统

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

X2一键下载图片附件到本地

[复制链接]
vinsonwang 发表于 2011-4-29 12:27:59 | 显示全部楼层 |阅读模式
*************************************************
** 本教程基于版本:Discuz! X 2.0               **
*************************************************
以前,用户在论坛中发一些图片,会有一部分是从其它的站点直接复制内容过来,这样复制过来的图片只是一个附件地址,保存在主题和帖子内容中,一旦其它站点开启防盗链或改动图片附件的文件夹位置,就会造成图片不能正常显示甚至死链。同时对站长自己附件的管理也带来了麻烦,影响网站运行效果。Discuz!X2.0中在编辑器中新增加了一键下载远程图片到本地的功能,一般默认点击“高级”,在“word“下面会有一个按钮,发带有图片地址的主题或帖子时,按下这个按钮,就会把图片下载到本地服务器。下面介绍一下这个下载到本地服务器的过程。
找到 source\module\forum\forum_ajax.php,大约320行:
  1. elseif($_G['gp_action'] == 'downremoteimg') {
  2.          $_G['gp_message'] = dstripslashes($_G['gp_message']);
  3.          $_G['gp_message'] = str_replace(array("\r", "\n", "\r\n"), '', $_G['gp_message']);
  4.          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);
  5.          preg_match_all("/\<img.+src=('|"|)?(.*)(\\1)([\s].*)?\>/ismUe", $_G['gp_message'], $image2, PREG_SET_ORDER);
  6.          $temp = $aids = $existentimg = array();
复制代码
这段代码是对内容 $G_[‘gp_message’] 删除由 addslashes() 函数添加的反斜杠,str_replace替换换行符等,即还原文本;preg_match_all 是对文本中图片几种地址进行全局匹配,结果保存在 $image1、$ image2 中。初始化变量。
  1. if(is_array($image1) && !empty($image1)) {
  2.    foreach($image1 as $value) {
  3.         $temp[] = array(
  4.                          '0' => $value[0],
  5.                          '1' => trim(!empty($value[1]) ? $value[1] : $value[2])
  6.         );
  7. }
  8. }
  9. if(is_array($image2) && !empty($image2)) {
  10.    foreach($image2 as $value) {
  11.                 $temp[] = array(
  12.                                  '0' => $value[0],
  13.                                  '1' => trim($value[2])
  14.                 );
  15.    }
  16. }
  17. require_once libfile('class/image');
复制代码
这段是对匹配后的结果进行遍历赋值,并包含图片处理类。
  1. if(is_array($temp) && !empty($temp)) {
  2.            require_once libfile('class/upload');
  3.            $upload = new discuz_upload();
  4.            $attachaids = array();
  5.          
  6.            foreach($temp as $value) {
  7.                                 …………………中间略去…………………
  8. if(!@$fp = fopen($attach['target'], 'wb')) {
  9.                 continue;
  10. } else {
  11.                 flock($fp, 2);
  12.                 fwrite($fp, $content);
  13.                 fclose($fp);
  14. }
  15. if(!$upload->get_image_info($attach['target'])) {
  16.                 @unlink($attach['target']);
  17.                 continue;
  18. }
复制代码
这一段的目的是对下载下来的附件进行地址、图片信息、缩略图等进行处理,并写入文件保存,并且判断是不是图片,如果不是,则删除----unlink($attach['target']);。
  1. $attach['size'] = filesize($attach['target']);
  2.    $upload->attach = $attach;
  3.    $thumb = $width = 0;
  4.    if($upload->attach['isimage']) {
  5.                         …………………中间内容省略………………………
  6.    $aids[] = $aid = getattachnewaid();
  7.    $setarr = array(//得到图片附件相关信息
  8.                         'aid' => $aid,
  9.                         'dateline' => $_G['timestamp'],
  10.                         'filename' => daddslashes($upload->attach['name']),
  11.                         'filesize' => $upload->attach['size'],
  12.                         'attachment' => $upload->attach['attachment'],
  13.                         'isimage' => $upload->attach['isimage'],
  14.                         'uid' => $_G['uid'],
  15.                         'thumb' => $thumb,
  16.                         'remote' => '0',
  17.                         'width' => $width
  18.    );                                          
  19.    DB::insert("forum_attachment_unused", $setarr);//入库
  20.    $attachaids[$hash] = $imagereplace['newimageurl'][] = '[attachimg]'.$aid.'[/attachimg]';

  21. } else {
  22.    $imagereplace['newimageurl'][] = $attachaids[$hash];
  23. }
复制代码
这段是把图片附件的信息进行处理,通过 getattachnewaid 函数把主题或帖子相关图片信息插入附件表。
  1. if(!empty($aids)) {
  2.         require_once libfile('function/post');
  3.         ftpupload($aids);
  4. }
  5. $_G['gp_message'] = str_replace($imagereplace['oldimageurl'], $imagereplace['newimageurl'], $_G['gp_message']);
  6. $_G['gp_message'] = addcslashes($_G['gp_message'], '/"\\');

  7. }
复制代码
最后这段就是真正把图片附件上传到自己本地服务器,并将文本再 addcslashes 处理。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|Discuz! 官方站 ( 皖ICP备16010102号 )star

GMT+8, 2024-11-23 21:06 , Processed in 0.020797 second(s), 3 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表