1。远程附件设置
Discuz软件提供了一个远程附件的功能,启用后能将站内上传的各种文件(如日志文章帖子里加的相册图片和文章帖子里加的附件)都放在和网站服务器分离的一个远程空间里去。谢谢网友 carry0987 提供了这样一个空间,让我能有机会测试下这个功能。他提供的远程空间信息是(文中的用户名和密码是虚拟的):- FTP主機IP: 31.170.165.167
- FTP主機名: ftp.qbnehs.esy.es
- FTP用戶名: u123456784
- FTP密碼: A1234567
在我的测试网站 http://distst.website/dz32 上的管理中心的全局->上传设置->远程附件里做了如下设置:
主动模式和被动模式是FTP通信里的两种工作模式,名称源于服务器端是否向客户端发起连接,见 http://www.slacksite.com/other/ftp.html 里的介绍。有些FTP服务器只支持主动模式,有些只支持被动模式(如Godaddy),有些两种都支持。FTP客户端必须用服务器端支持的模式来和服务器通信。
下面是在看到的远程空间里的内容:在设置时填写的'远程附件目录'(我上面填的是test)相当于基本设置里的'本地附件保持位置'(默认值是./data/attachment),两者下面有同样的文件夹结构。
现在在日志文章相册和论坛里加的图片和附件都到了远程空间:而且在相册里将图片删掉和论坛里将附件删掉后,它们在远程空间里也立刻消失了。
再从cPanel进入我的网站服务器里看,那些上传文件都没存在网站服务器里,而只存在了远程空间里。网站服务器上只有空文件夹。
2。如何在程序里接触远程附件
先看看如何在程序里得到远程附件里的设置值。它们的值在程序里都可以按它们的设置名来获取: getglobal('setting/ftp/设置名') 或 $_G['setting']['ftp']['设置名'] 。下面是那些设置项的标签和设置名的对应表:- 启用远程附件 on
- 启用 SSL 连接 ssl
- FTP 服务器地址: host
- FTP 服务器端口: port
- FTP 帐号: username
- FTP 密码: password
- 被动模式(pasv)连接: pasv
- 远程附件目录: attachdir
- 远程访问 URL: attachurl
- FTP 传输超时时间: timeout
- 允许的附件扩展名: allowedexts
- 禁止的附件扩展名: disallowedexts
- 附件尺寸下限: minsize
- 隐藏远程附件真实路径: hideurl
比如'启用远程附件'设置值可用 getglobal('setting/ftp/on') 或 $_G['setting']['ftp']['on'] 来得到。
PHP提供了一整套与远程空间联系的FTP客户端函数,见 http://php.net/manual/zh/ref.ftp.php,而Discuz将它们包在了一个叫discuz_ftp的单例模式的类里,定义在文件source/class/discuz/discuz_ftp.php里。然后又在文件source/function/function_core.php里定义了函数 ftpcmd 作为统一入口来调用discuz_ftp类里的各函数。所以所有用到Discuz里远程附件功能的地方就只要调用这个函数就行了。
下面以在相册里上传图片为例看看是如何用这个函数的。在上传图片时,浏览器给网站服务器发了下面的请求:
- POST /discuz32/misc.php?mod=swfupload&action=swfupload&operation=album HTTP/1.1
复制代码 在服务器端是由下面这些脚本文件来传递和合作处理这个请求的:- misc.php
- => source/module/misc/misc_swfupload.php
- => pic_save in source/function/function_spacecp.php
复制代码 上传后的图片先存在了网站本地附件目录里。如果网站启用了远程附件的话,会将刚存在本地的图片拷贝到远程空间去,然后再删除本地图片。其中用到 ftpcmd 的相关代码就在函数 pic_save 内:- if(getglobal('setting/ftp/on')) {
- $ftpresult = ftpcmd('upload', 'album/'.$upload->attach['attachment']);
- if($ftpresult) {
- @unlink($_G['setting']['attachdir'].'album/'.$upload->attach['attachment']);
复制代码
|