最新整合阿里云OSS方法-phpcms

戏子无情 提交于 2019-12-07 11:56:12

1、为简化整合步骤,使用该方法整合后,默认是所有图片、附件都要上传至OSS,并未在后台设置中添加是否启用OSS的开关。
2、上传的图片或附件,还是会在PHPCMS所在服务器保留一份。主要是基于以下原因:
  a、PHPCMS内部很多地方会检查本地是否有文件图片存在,如果全修改成去检查OSS,需要改动很多地方且效率低;
  b、模板中的 thumb 函数只支持通过本地文件来创建缩略图;
  c、在本地有一份备份,可在OSS出问题时提供恢复数据。
所以要求PHPCMS所在服务器得有足够空间来保存图片或附件。

【可实现的功能】
1、发布内容时,点击富文本编辑器中的图片上传按钮,可将图片上传到OSS。
2、发布内容时,点击富文本编辑器中的附件上传按钮,可将附件上传到OSS。
3、发布内容时,如果内容中有引用站外的图片链接,且在模型管理的editor字段设置中启用了“保存远程图片”,则会将站外图片下载到本地,并上传到OSS。
4、在模板中使用 thumb 函数生成的小尺寸缩略图,也会上传到OSS。

【整合方法】
1、从阿里云下载SDK包:https://help.aliyun.com/document_detail/32099.html

2、将下载的SDK压缩包解压,得到 aliyun-oss-php-sdk-master 目录。

3、在 phpcms/libs/classes 目录下新建 OSS 目录。

4、将压缩包解压目录中的以下文件和目录,复制到  phpcms/libs/classes/OSS 目录中。
aliyun-oss-php-sdk-master/autoload.php
aliyun-oss-php-sdk-master/src/OSS/

5、在 phpcms/libs/classes/OSS 目录中新建 OSSConfig.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/
    }
    ?>

6、修改 autoload.php,将

    $file = __DIR__ . DIRECTORY_SEPARATOR .'src'. DIRECTORY_SEPARATOR . $path . '.php';

修改为

$file = __DIR__ . DIRECTORY_SEPARATOR . $path . '.php';

7、修改 phpcms/libs/classes/attachment.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 **********/

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 方法中的

     if($watermark){
                                        watermark($newfile, $newfile,$this->siteid);
                                }
                                $filepath = $dir.$filename;

下面添加

 /********** 阿里云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);
        }

变更为

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);
        }

8、修改 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 **********/

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!