一、为简化整合步骤,使用该方法整合后,默认是全部图片、附件都要上传至OSS,并未在后台设置中添加是否启用OSS的开关。
二、上传的图片或附件,仍是会在PHPCMS所在服务器保留一份。主要是基于如下缘由:
a、PHPCMS内部不少地方会检查本地是否有文件图片存在,若是全修改为去检查OSS,须要改动不少地方且效率低;
b、模板中的 thumb 函数只支持经过本地文件来建立缩略图;
c、在本地有一份备份,可在OSS出问题时提供恢复数据。
因此要求PHPCMS所在服务器得有足够空间来保存图片或附件。
【可实现的功能】
一、发布内容时,点击富文本编辑器中的图片上传按钮,可将图片上传到OSS。
二、发布内容时,点击富文本编辑器中的附件上传按钮,可将附件上传到OSS。
三、发布内容时,若是内容中有引用站外的图片连接,且在模型管理的editor字段设置中启用了“保存远程图片”,则会将站外图片下载到本地,并上传到OSS。
四、在模板中使用 thumb 函数生成的小尺寸缩略图,也会上传到OSS。
【整合方法】
一、从阿里云下载SDK包:https://help.aliyun.com/document_detail/32099.html
二、将下载的SDK压缩包解压,获得 aliyun-oss-php-sdk-master 目录。
三、在 phpcms/libs/classes 目录下新建 OSS 目录。
四、将压缩包解压目录中的如下文件和目录,复制到 phpcms/libs/classes/OSS 目录中。
aliyun-oss-php-sdk-master/autoload.php
aliyun-oss-php-sdk-master/src/OSS/
五、在 phpcms/libs/classes/OSS 目录中新建 OSSConfig.php 文件,内容以下:php
<?php final class OSSConfig { const OSS_ACCESS_ID = ''; //Access Key ID,建议使用阿里云的“访问控制RAM”为OSS操做新建一个用户,并使用该用户的 Access Key ID 和 Access Key Secret。请见 https://help.aliyun.com/document_detail/31932.html const OSS_ACCESS_KEY = ''; //Access Key Secret const OSS_ENDPOINT = ''; //endpoint是根据你的OSS所在区域填写的,请见 https://help.aliyun.com/document_detail/31837.html const OSS_BUCKET = ''; //Bucket 名称 const OSS_PATH = 'upload/'; //上传路径(不为空时后面须要添加斜线)。能够为空,那么上传路径就会是 年/月日/图片文件,好比 2016/0814/20160814061725368.jpg。建议最好加1~2级路径,如 upload/ 或 appname/upload/ } ?>
六、修改 autoload.php,将html
$file = __DIR__ . DIRECTORY_SEPARATOR .'src'. DIRECTORY_SEPARATOR . $path . '.php';
修改成服务器
$file = __DIR__ . DIRECTORY_SEPARATOR . $path . '.php';
七、修改 phpcms/libs/classes/attachment.class.php 文件,在文件最开始的 <?php 下面添加:app
/********** 阿里云OSS加载 S **********/ require_once 'OSS/OSSConfig.php'; require_once 'OSS/autoload.php'; use OSS\OssClient; use OSS\Core\OssUtil; use OSS\Core\OssException; /********** 阿里云OSS加载 E **********/
在 upload 方法中的编辑器
if($watermark_enable) { $image->watermark($savefile, $savefile); }
下面添加函数
/********** 阿里云OSS上传 S **********/ $ossClient = new OssClient(OSSConfig::OSS_ACCESS_ID, OSSConfig::OSS_ACCESS_KEY, OSSConfig::OSS_ENDPOINT); $ossClient->uploadFile(OSSConfig::OSS_BUCKET, OSSConfig::OSS_PATH.$filepath, $this->upload_root.$filepath); /********** 阿里云OSS上传 E **********/
在 download 方法中的ui
if($watermark){ watermark($newfile, $newfile,$this->siteid); } $filepath = $dir.$filename;
下面添加this
/********** 阿里云OSS上传 S **********/ $ossClient = new OssClient(OSSConfig::OSS_ACCESS_ID, OSSConfig::OSS_ACCESS_KEY, OSSConfig::OSS_ENDPOINT); $ossClient->uploadFile(OSSConfig::OSS_BUCKET, OSSConfig::OSS_PATH.$filepath, $this->upload_root.$filepath); /********** 阿里云OSS上传 E **********/
修改 delete 方法阿里云
function delete($where) { $this->att_db = pc_base::load_model('attachment_model'); $result = $this->att_db->select($where); foreach($result as $r) { $image = $this->upload_root.$r['filepath']; @unlink($image); $thumbs = glob(dirname($image).'/*'.basename($image)); if($thumbs) foreach($thumbs as $thumb) @unlink($thumb); } return $this->att_db->delete($where); }
变动为code
function delete($where) { $ossClient = new OssClient(OSSConfig::OSS_ACCESS_ID, OSSConfig::OSS_ACCESS_KEY, OSSConfig::OSS_ENDPOINT); $this->att_db = pc_base::load_model('attachment_model'); $upload_path = pc_base::load_config('system','upload_path'); $result = $this->att_db->select($where); foreach($result as $r) { $image = $this->upload_root.$r['filepath']; @unlink($image); /********** 阿里云OSS删除 S **********/ $ossClient->deleteObject(OSSConfig::OSS_BUCKET, OSSConfig::OSS_PATH.$r['filepath']); /********** 阿里云OSS删除 E **********/ $thumbs = glob(dirname($image).'/*'.basename($image)); if ($thumbs) { foreach ($thumbs as $thumb) { @unlink($thumb); $thumb = str_replace($upload_path, '', $thumb); /********** 阿里云OSS删除缩略图 S **********/ $ossClient->deleteObject(OSSConfig::OSS_BUCKET, OSSConfig::OSS_PATH.$thumb); /********** 阿里云OSS删除缩略图 E **********/ } } } return $this->att_db->delete($where); }
八、修改 phpcms/libs/classes/image.class.php 文件,在文件最开始的 <?php 下面添加:
/********** 阿里云OSS加载 S **********/ require_once 'OSS/OSSConfig.php'; require_once 'OSS/autoload.php'; use OSS\OssClient; use OSS\Core\OssUtil; use OSS\Core\OssException; /********** 阿里云OSS加载 E **********/
在 thumb 方法中的
if(empty($filename)) $filename = substr($image, 0, strrpos($image, '.')).$suffix.'.'.$type; $imagefun($thumbimg, $filename);
下面添加
/********** 阿里云OSS上传缩略图 S **********/ $upload_path = pc_base::load_config('system','upload_path'); $object = str_replace($upload_path, '', $filename); $ossClient = new OssClient(OSSConfig::OSS_ACCESS_ID, OSSConfig::OSS_ACCESS_KEY, OSSConfig::OSS_ENDPOINT); $ossClient->uploadFile(OSSConfig::OSS_BUCKET, OSSConfig::OSS_PATH.$object, $filename); /********** 阿里云OSS上传缩略图 E **********/