Discuz里面有个显示图片的通用入口。链接URL如下:「forum.php?mod=image&aid=145489&size=297x231&key=dfad7d044e81ae8d&type=fixnone」
如果你需要显示一张图片缩略图时只需要知道图片的aid即可生成对应的缩略图完整的url。那么DZ是怎么实现这个功能的呢?
今天看看Discuz X!的关于forum.php?mode=image里面的核心实现方法(./source/module/forum/forum_image.php),重要的行后面已经代码分析并添加注释:
<?php
/**
* [Discuz!] (C)2001-2099 Comsenz Inc.
* This is NOT a freeware, use is subject to license terms
*
* $Id: forum_image.php 32531 2013-02-06 10:15:19Z zhangguosheng $
*/
if(!defined('IN_DISCUZ') || empty($_GET['aid']) || empty($_GET['size']) || empty($_GET['key'])) {
header('location: '.$_G['siteurl'].'static/image/common/none.gif');
exit;
}//判断环境是否为Discuz环境下,并检查相关参数是否完整。正常完整的参数应该是:forum.php?mod=image&aid=145489&size=297x231&key=dfad7d044e81ae8d&type=fixnone
$nocache = !empty($_GET['nocache']) ? 1 : 0;//是否启用了不使用缓存的模式,该模式下会重新生成缩略图文件
$daid = intval($_GET['aid']);//附件的aid
$type = !empty($_GET['type']) ? $_GET['type'] : 'fixwr';//缩略图显示模式,2种模式,1=fixone,2=fixwr
list($w, $h) = explode('x', $_GET['size']);//获取url参数里面的宽和高值
$dw = intval($w);
$dh = intval($h);
$thumbfile = 'image/'.helper_attach::makethumbpath($daid, $dw, $dh);$attachurl = helper_attach::attachpreurl();
if(!$nocache) {//如果不是非缓存模式,先判断该图片缓存文件是否已经存在。存在的情况下直接返回
if(file_exists($_G['setting']['attachdir'].$thumbfile)) {
dheader('location: '.$attachurl.$thumbfile);
}
}
define('NOROBOT', TRUE);
$id = !empty($_GET['atid']) ? $_GET['atid'] : $daid;
if(dsign($id.'|'.$dw.'|'.$dh) != $_GET['key']) {
dheader('location: '.$_G['siteurl'].'static/image/common/none.gif');
}//对key的验证,如果key非法,直接显示空的图片
if($attach = C::t('forum_attachment_n')->fetch('aid:'.$daid, $daid, array(1, -1))) {//附件id是否合法
if(!$dw && !$dh && $attach['tid'] != $id) {//如果传过来的是tid,tid的值跟数据库里不一样
dheader('location: '.$_G['siteurl'].'static/image/common/none.gif');
}
dheader('Expires: '.gmdate('D, d M Y H:i:s', TIMESTAMP + 3600).' GMT');//图片过期时间3600秒
if($attach['remote']) {//附件保存在ftp上,
$filename = $_G['setting']['ftp']['attachurl'].'forum/'.$attach['attachment'];
} else {
$filename = $_G['setting']['attachdir'].'forum/'.$attach['attachment'];
}
require_once libfile('class/image');
$img = new image;
if($img->Thumb($filename, $thumbfile, $w, $h, $type)) {//图片处理核心类方法创建缩略图
if($nocache) {//不使用缓存,读取文件后删除文件
dheader('Content-Type: image');
@readfile($_G['setting']['attachdir'].$thumbfile);
@unlink($_G['setting']['attachdir'].$thumbfile);
} else {
dheader('location: '.$attachurl.$thumbfile);
}
} else {//失败,尝试直接读取。
dheader('Content-Type: image');
@readfile($filename);
}
}