thinkphp使用event监听上传图片后上传到oss
时间: 2024-06-11 19:05:52 浏览: 98
thinkphp实现图片上传功能
首先,需要在config目录下的event.php中添加一个事件监听器,监听上传图片成功的事件:
```php
'upload_image_success' => [
'app\listener\UploadImageSuccess',
],
```
然后,在app目录下创建一个listener目录,并在该目录下创建一个UploadImageSuccess.php文件,用于处理上传图片成功的事件:
```php
<?php
namespace app\listener;
use think\facade\Log;
use app\common\Oss;
class UploadImageSuccess
{
public function handle($event)
{
$file = $event->file;
// 上传到OSS
$oss = new Oss();
$result = $oss->upload($file->getRealPath(), 'images/' . $file->getSaveName());
// 删除本地文件
unlink($file->getRealPath());
// 记录日志
Log::info('Image uploaded to OSS: ' . $result['url']);
}
}
```
在事件处理器中,我们首先获取上传成功的图片文件,然后将其上传到阿里云OSS中,并记录上传的日志。最后,删除本地的上传文件。
接下来,我们还需要创建一个Oss.php文件,用于连接阿里云OSS并上传文件:
```php
<?php
namespace app\common;
use OSS\OssClient;
use OSS\Core\OssException;
class Oss
{
private $client;
public function __construct()
{
$accessKeyId = 'your_access_key_id';
$accessKeySecret = 'your_access_key_secret';
$endpoint = 'your_oss_endpoint';
$bucket = 'your_bucket_name';
try {
$this->client = new OssClient($accessKeyId, $accessKeySecret, $endpoint);
} catch (OssException $e) {
throw new \Exception($e->getMessage());
}
}
public function upload($filePath, $objectKey)
{
try {
$result = $this->client->uploadFile($bucket, $objectKey, $filePath);
return [
'url' => $result['oss-request-url'],
'etag' => $result['etag'],
];
} catch (OssException $e) {
throw new \Exception($e->getMessage());
}
}
}
```
在Oss.php文件中,我们首先需要填写阿里云OSS的accessKeyId、accessKeySecret、endpoint和bucket等信息,并创建了一个OssClient对象。然后,我们定义了一个upload方法,用于上传文件到OSS,返回上传成功的url和etag。
最后,我们可以在上传图片的控制器中触发上传图片成功的事件:
```php
<?php
namespace app\controller;
use think\facade\Request;
class Image
{
public function upload()
{
$file = Request::file('image');
// 保存到本地
$savePath = 'upload/images/' . date('Ymd');
$info = $file->validate(['ext' => 'jpg,png,gif'])->move($savePath);
if ($info) {
// 触发上传图片成功的事件
event('upload_image_success', ['file' => $info]);
return json(['url' => '/'.$savePath.'/'.$info->getSaveName()]);
} else {
return json(['error' => $file->getError()]);
}
}
}
```
在上传图片的控制器中,我们首先将图片保存到本地,如果保存成功,就触发上传图片成功的事件,将图片上传到阿里云OSS中。最后,返回上传成功的图片url。
通过这样的方式,我们就可以将上传的图片保存到阿里云OSS中,减轻服务器的压力,提高图片访问速度。
阅读全文