ThinkPHP框架集成Ueditor编辑器,并将图片上传到阿里云OSS

网上有很多界面美观整洁的编辑器插件,但是相比较功能而言,还是百度的ueditor更为丰富,所以我选择了在项目中使用这款编辑器,下面介绍操作步骤,代码不多,自己动手,丰衣足食。

一、在项目中集成Ueditor插件:

首先,去官网下载对应版本的压缩包,因为用的是thinkPHP框架,所以这里选择了1.4.3.3 PHP 版本,UTF-8编码下载;

接着,解压下载的文件夹,将utf8-php文件夹下的所有文件全部拷贝到public/static/lib/ueditor文件夹下,lib是我项目中所有js插件的 存放地,下面的路径也以这个为准;

在模板文件中引用ueditor.config.js和ueditor.all.js就可以使用ueditor编辑器了,具体用法不再赘述。

二、将Ueditor编辑器中的文件上传到阿里云OSS

1.参考网页https://help.aliyun.com/document_detail/85580.html下载阿里云OSS PHP版sdk,将oss-sdk-php文件夹复制到/vendor/aliyuncs文件夹下(具体安装办法自选);

2.修改Ueditor插件下的php/Uploader.class.php文件:

1)在文件顶部引入autoload文件,并使用相应的命名空间:

//如果你的代码存放路径跟我一样的话,这样可以直接使用
//这里我试过相对路径,发现不行,所以改用了绝对路径
require_once realpath(dirname(__FILE__) . '/../../../../') . '/vendor/aliyuncs/oss-sdk-php/autoload.php';
use OSS\OssClient;
use OSS\Core\OssException;

2)注释掉文件中110+行创建目录失败和移动文件两段代码,将其替换为上传到阿里云OSS的代码,替换代码如下:

//oss设置
$ossconfig = [
			'KeyId' => 'xxx',
			'KeySecret' => 'xxx',
			'Endpoint' => 'http://oss-cn-beijing.aliyuncs.com',
			'Bucket' => 'xxx'
		];

		//获取文件后缀
        $file_type = substr($this->filePath, strrpos($this->filePath, '.'));
		//得到今天日期
		$today = date('Ymd', time());
        //得到文件名
        $file_name = 'image/'.$today.'/'.$this->fileName;
        //$ossconfig为获取OSS的配置信息
        //$ossconfig = $this->getOssApi();
        //实例化OSS
        $ossClient = new OssClient($ossconfig['KeyId'], $ossconfig['KeySecret'], $ossconfig['Endpoint']);
        try {
            //执行阿里云上传
            $result = $ossClient->uploadFile($ossconfig['Bucket'], $file_name, $file["tmp_name"]);
            //赋给图片路径(原代码)
//          $this->fullName = $result['info']['url'];
//获得上传之后访问该图片的路径
			$endpoint = str_replace('http://', '', $ossconfig['Endpoint']);
            $this->ossimgurl = "https://".$ossconfig['Bucket'].".".$endpoint."/".$file_name;//ossimgurl这是自定义属性,避免以ueditor方式获得图片地址
            $this->stateInfo = $this->stateMap[0];
        } catch (OssException $e) {
//          $this->stateInfo = $this->getStateInfo("ERROR_FILE_MOVE");
            //将错误信息修改为阿里云上传失败的错误信息
            $this->stateInfo = $e->getMessage();
        }

修改到这里,就可以将图片上传到OSS了,打开编辑器页面尝试下,复制一张图片到编辑器,然后点击html查看源代码,就可以看到阿图片上传到阿里云之后的访问路径了。

PS:注意,虽然我们实现了上传到OSS的功能,但实际上,无论是草稿图片还是正式的文章图片都会上传,如果你希望节省OSS的使用空间,那么就需要在编辑器中删除图片的时候,同样删除OSS中的图片(想了一下,操作复杂,没做),或者你可以祈求各位编辑大大手下留情,不要上传那么多的垃圾图片。

三、将ueditor插件后台代码整合到thinkPHP框架

上面的操作虽然实现了我们的目标,但是细心的同学们已经发现,我们把ueditor后台的操作代码暴露到了public文件夹下,这就意味着用户可以直接访问到这些文件,相对而言很不安全,所以我们需要进一步优化这些代码,将其集成到thinkPHP框架下,步骤如下:

1.新建sdk应用模块,即在application文件夹下新建sdk文件夹,并在该模块下创建Ueditor控制器,具体路径为application/sdk/controller/Ueditor.php;

2.将ueditor/php文件夹下的所有文件移动到application/sdk/controller文件夹下;

3.在Ueditor.php控制器中新建upload方法,并将controller.php文件中的所有代码复制到upload方法中,相应地,需要修改下期中config.json文件的路径,修改后的控制器代码如下:

<?php
namespace app\sdk\controller;

use think\Controller;

class Ueditor extends Controller
{
	
	//首页
    public function upload()
    {
    	//header('Access-Control-Allow-Origin: http://www.baidu.com'); //设置http://www.baidu.com允许跨域访问
		//header('Access-Control-Allow-Headers: X-Requested-With,X_Requested_With'); //设置允许的跨域header
		date_default_timezone_set("Asia/chongqing");
		error_reporting(E_ERROR);
		header("Content-Type: text/html; charset=utf-8");
		
        //同样的,修改为绝对路径
		$current_path = __DIR__.'/';
		$CONFIG = json_decode(preg_replace("/\/\*[\s\S]+?\*\//", "", file_get_contents($current_path."config.json")), true);
//		$action = $_GET['action'];
		$action = request()->param('action');
		
		switch ($action) {
		    case 'config':
		        $result =  json_encode($CONFIG);
		        break;
		
		    /* 上传图片 */
		    case 'uploadimage':
		    /* 上传涂鸦 */
		    case 'uploadscrawl':
		    /* 上传视频 */
		    case 'uploadvideo':
		    /* 上传文件 */
		    case 'uploadfile':
		        $result = include("action_upload.php");
		        break;
		
		    /* 列出图片 */
		    case 'listimage':
		        $result = include("action_list.php");
		        break;
		    /* 列出文件 */
		    case 'listfile':
		        $result = include("action_list.php");
		        break;
		
		    /* 抓取远程文件 */
		    case 'catchimage':
		        $result = include("action_crawler.php");
		        break;
		
		    default:
		        $result = json_encode(array(
		            'state'=> '请求地址出错'
		        ));
		        break;
		}
		
		/* 输出结果 */
		if (isset($_GET["callback"])) {
		    if (preg_match("/^[\w_]+$/", $_GET["callback"])) {
		        echo htmlspecialchars($_GET["callback"]) . '(' . $result . ')';
		    } else {
		        echo json_encode(array(
		            'state'=> 'callback参数不合法'
		        ));
		    }
		} else {
		    echo $result;
		}
    }
}

相应地,controller.php文件已经没用了,可以删掉。

4.因为文件路径改变了,所有需要修改下uploader.class.php文件中autoload的加载路径,新路径为:

$dir = dirname(dirname(dirname(__DIR__)));
require_once $dir.'/vendor/aliyuncs/oss-sdk-php/autoload.php';
   
use OSS\OssClient;
use OSS\Core\OssException;

5.不要忘记在路由文件中加上新的路由:

//Ueditor
Route::rule('/ueditor/upload', 'sdk/ueditor/upload', 'get|post');

注意:这里一定要加上post方式,get方式可以获取配置,上传文件就得用post了。

6.最后一条,记得在ueditor.config.js中修改上传文件的路径,修改public/static/lib/ueditor/lib/ueditor/ueditor.config.js文件:

// 服务器统一请求接口路径
        // , serverUrl: URL + "php/controller.php"
        , serverUrl:"/ueditor/upload"

OK,到此为止,操作完成,刷新页面(不是开发者模式的清空缓存),重新复制一张图片到编辑器窗口,等图片加载完成时查看源代码,搞定。

后记,为了实现功能,代码写的有些乱,比如ossconfig直接写到了uploader.class.php文件中,正常的做法是应该放置到配置文件中,使用时获得配置,这些就自己实现吧。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是使用 ThinkPHP 集成阿里云 OSS 的代码示例: 1. 安装阿里云 OSS SDK 在项目根目录下的 `composer.json` 文件中添加阿里云 OSS SDK 的依赖: ``` "require": { "aliyuncs/oss-sdk-php": "^2.5" } ``` 然后执行 `composer install` 来安装依赖。 2. 配置阿里云 OSS 在 `config` 目录下新建 `oss.php` 配置文件,并添加以下内容: ```php return [ 'access_key_id' => 'your_access_key_id', 'access_key_secret' => 'your_access_key_secret', 'bucket' => 'your_bucket_name', 'endpoint' => 'your_endpoint', ]; ``` 其中,`access_key_id` 和 `access_key_secret` 是您的阿里云账号的 Access Key ID 和 Access Key Secret,`bucket` 是您的 OSS 存储桶名称,`endpoint` 是您的 OSS 访问域名。 3. 初始化阿里云 OSS 在 `app` 目录下新建 `common.php` 文件,并添加以下内容: ```php use OSS\OssClient; if (!function_exists('oss')) { function oss() { $config = config('oss'); $ossClient = new OssClient( $config['access_key_id'], $config['access_key_secret'], $config['endpoint'] ); return $ossClient; } } ``` 这里我们使用了一个自定义的全局函数 `oss()` 来初始化阿里云 OSS 客户端。 4. 上传文件到阿里云 OSS ```php use OSS\Core\OssException; try { $result = oss()->uploadFile( $bucket, $object, $file ); } catch (OssException $e) { // 处理异常 } ``` 其中,`$bucket` 是您的 OSS 存储桶名称,`$object` 是上传到 OSS 的文件路径和文件名,`$file` 是本地要上传的文件路径。 5. 下载文件 ```php use OSS\Core\OssException; try { oss()->getObject( $bucket, $object, $options ); } catch (OssException $e) { // 处理异常 } ``` 其中,`$bucket` 是您的 OSS 存储桶名称,`$object` 是要下载的文件路径和文件名,`$options` 是一个可选的参数数组,用于指定下载文件的一些选项,比如 `fileDownload` 用于指定下载时的文件名。 以上是使用 ThinkPHP 集成阿里云 OSS 的基本操作示例。如果您需要进行其他操作,可以参考阿里云 OSS SDK 的文档和 API 参考。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值