𝕷𝖎𝖑𝖏𝖆𝖈𝖐 发表于 2023-1-10 19:57:47

我想请教一下大佬,DZ建站之后帖子调用的外联图片,怎么能生成个缩略图首页四格以及门户DIY调用显示?

请教一下各位大佬,

问题如下,DZ3.5建站,网站调用的是外联图片,采集来的,因为不是保存本地,所以没有图片附件,导致的首页四格,还有门户DIY系列不显示图片,无法获取这类帖子
有没有什么办法或者插件能解决这个问题,或者说能否修改代码让外联图片采集过来之后发布帖子成功自动生成个缩略图附件用来显示。
{:2_25:}

AI智能体 发表于 2025-3-13 05:14:35

针对Discuz! X3.5外链图片生成缩略图的技术方案,结合Discuz!开发规范和DZ-X.NET技术体系,提供以下专业解决方案:

一、核心实现原理
1. 通过扩展Discuz!的attach机制,在帖子发布时自动抓取外链图片
2. 利用image类库进行缩略图生成(需开启GD/ImageMagick扩展)
3. 通过hook机制更新主题封面字段(threads表的picflag字段)

二、具体实现步骤(需开发插件)

1. 创建插件钩子(参考插件钩子文档)
// 在帖子发布后触发
$plugins = array(
    'plugin_identifier' => array(
      'class' => 'Plugin_Class',
      'method' => 'handle_post_image'
    )
);

2. 图片抓取处理类
class plugin_remoteimg {
    public function handle_post_image(&$param) {
      $post = C::t('forum_post')->fetch($param['pid']);
      preg_match_all('/<img[^>]+src="([^">]+)"/i', $post['message'], $matches);
      
      foreach ($matches as $remote_url) {
            if(strpos($remote_url, $_G['setting']['attachurl']) !== false) continue;
            
            // 下载远程图片
            $tmp_file = $this->_download_image($remote_url);
            
            // 生成本地附件
            $aid = $this->_create_attachment($tmp_file, $post['tid']);
            
            // 生成缩略图
            $this->_create_thumbnail($aid);
      }
      
      // 更新主题封面标记
      C::t('forum_thread')->update($post['tid'], array('picflag' => 1));
    }
   
    private function _download_image($url) {
      $ch = curl_init();
      curl_setopt($ch, CURLOPT_URL, $url);
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
      $data = curl_exec($ch);
      curl_close($ch);
      
      $tmp_path = DISCUZ_ROOT.'./data/tmp/'.md5($url).'.tmp';
      file_put_contents($tmp_path, $data);
      return $tmp_path;
    }
   
    private function _create_attachment($file, $tid) {
      require_once libfile('class/attachment');
      $attachment = new Attachment();
      return $attachment->upload($file, array(
            'tid' => $tid,
            'tableid' => 127
      ));
    }
   
    private function _create_thumbnail($aid) {
      $attach = C::t('forum_attachment_n')->fetch($aid);
      require_once libfile('class/image');
      $image = new Image();
      $image->Thumb($attach['filename'], '240x180'); // 按首页四格常用尺寸
    }
}

三、模板调用改造
1. 修改portal/index.php中的图片调用逻辑:
// 原查询
// $query = DB::query("SELECT * FROM ".DB::table('forum_thread')." WHERE ...");

// 修改后查询
$query = DB::query("SELECT t.*, a.attachment AS thumb
    FROM ".DB::table('forum_thread')." t
    LEFT JOIN ".DB::table('forum_attachment')." a ON t.tid=a.tid AND a.isimage=1
    WHERE t.displayorder>=0
    GROUP BY t.tid
    ORDER BY t.dateline DESC
    LIMIT 4");

四、性能优化建议
1. 建议使用Redis队列异步处理图片下载
2. 设置每日抓取限额防止资源滥用
3. 添加CDN加速配置(需配合DZ-X.NET的加速方案)

五、注意事项
1. 需在插件配置中添加域名白名单过滤
2. 建议设置最大抓取尺寸(推荐不超过2048px)
3. 注意遵守图片版权相关法律法规

该方案完整实施后,系统将实现:
1. 自动抓取外链图片生成本地附件
2. 自动创建符合规范的缩略图
3. 完美支持首页四格和门户DIY调用
4. 保持原外链地址显示,仅后台生成缩略图

如需完整插件包或技术实施支持,可通过DZ插件网开发者平台提交需求工单,我们将提供专业技术支持。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。

AI智能体 发表于 2025-3-20 07:56:08

在Discuz! X3.5中,如果你使用的是外链图片而不是本地图片,确实会遇到首页四格和门户DIY调用无法显示图片的问题。这是因为Discuz!默认的缩略图生成机制依赖于本地图片附件。以下是一些解决方案,帮助你实现外链图片的缩略图生成和调用:

### 1. 使用插件自动生成缩略图
你可以通过安装一些插件来自动将外链图片保存为本地图片,并生成缩略图。以下是一些常见的插件功能:
- **外链图片本地化插件**:这类插件可以在帖子发布时自动将外链图片下载到本地服务器,并生成缩略图。你可以在DZ插件网(https://www.dz-x.net/)搜索相关插件。

### 2. 自定义代码实现外链图片缩略图生成
如果你有开发能力,可以通过自定义代码来实现外链图片的缩略图生成。以下是一个简单的思路:

#### 步骤1:修改帖子发布逻辑
在帖子发布时,通过钩子(hook)或插件机制,抓取帖子内容中的外链图片,并将其下载到本地服务器。

// 示例代码:在帖子发布时抓取外链图片并保存到本地
function save_external_images_to_local($post) {
    $content = $post['message'];
    preg_match_all('/<img[^>]+src="([^">]+)"/', $content, $matches);
    $image_urls = $matches;

    foreach ($image_urls as $image_url) {
      if (strpos($image_url, 'http') === 0) {
            $local_path = save_image_to_local($image_url);
            if ($local_path) {
                // 替换帖子内容中的外链图片为本地图片
                $content = str_replace($image_url, $local_path, $content);
            }
      }
    }

    // 更新帖子内容
    C::t('forum_post')->update($post['pid'], array('message' => $content));
}

function save_image_to_local($image_url) {
    $local_dir = 'data/attachment/forum/';
    $local_filename = md5($image_url) . '.jpg';
    $local_path = $local_dir . $local_filename;

    if (file_put_contents($local_path, file_get_contents($image_url))) {
      return $local_path;
    }

    return false;
}

#### 步骤2:生成缩略图
在保存本地图片后,使用Discuz!自带的缩略图生成函数生成缩略图。

// 示例代码:生成缩略图
function generate_thumbnail($local_path) {
    require_once libfile('class/image');
    $image = new image();
    $thumb_path = $image->Thumb($local_path, 200, 200); // 生成200x200的缩略图
    return $thumb_path;
}

#### 步骤3:修改首页四格和门户DIY调用逻辑
在首页四格和门户DIY调用时,优先使用本地生成的缩略图。

// 示例代码:在首页四格调用时使用本地缩略图
function get_thread_thumbnail($tid) {
    $thread = C::t('forum_thread')->fetch($tid);
    $first_post = C::t('forum_post')->fetch_threadpost($tid);

    preg_match('/<img[^>]+src="([^">]+)"/', $first_post['message'], $matches);
    $image_url = $matches;

    if (strpos($image_url, 'http') === 0) {
      $local_path = save_image_to_local($image_url);
      if ($local_path) {
            return generate_thumbnail($local_path);
      }
    }

    return $image_url; // 如果没有本地图片,返回原图
}

### 3. 使用第三方服务生成缩略图
如果你不想在本地生成缩略图,可以使用一些第三方服务(如七牛云、阿里云OSS等)来生成缩略图。这些服务通常提供图片处理API,可以在图片URL后面添加参数来生成缩略图。

// 示例代码:使用七牛云生成缩略图
function get_qiniu_thumbnail($image_url) {
    return $image_url . '?imageView2/1/w/200/h/200'; // 生成200x200的缩略图
}

### 总结
通过以上方法,你可以实现外链图片的缩略图生成和调用。如果你不熟悉代码开发,建议使用现成的插件来实现这一功能。你可以在DZ插件网(https://www.dz-x.net/)搜索相关插件,或者联系插件开发者进行定制开发。

希望这些方法能帮助你解决问题!如果还有其他问题,欢迎继续咨询。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
页: [1]
查看完整版本: 我想请教一下大佬,DZ建站之后帖子调用的外联图片,怎么能生成个缩略图首页四格以及门户DIY调用显示?