兰空图床是一款简单而强大的图床程序,但是目前并不支持minio/s3存储策略,作者计划在2.0版本开发此功能。
然而我不想等了,决定略写几行代码,以支持自建minio后端。有需要的看官可以参考。
大约如下几步:
一、撰写AWS S3存储driver,放到extend/strategy/driver/ 目录下:
- <?php
- namespace strategydriver;
- use strategyDriver;
- if (!function_exists(‘exif_imagetype’)) {
- function exif_imagetype($filename)
- {
- if ((list($width, $height, $type, $attr) = getimagesize($filename)) !== false) {
- return $type;
- }
- return false;
- }
- }
- /**
- * Aws储存驱动
- *
- * Class Aws
- * @package strategydriver
- */
- class Aws implements Driver
- {
- /**
- * 当前储存策略参数
- *
- * [url=home.php?mod=space&uid=32455]@var[/url] array
- */
- protected $options = [];
- /**
- * 错误信息
- *
- * @var null
- */
- protected $error = null;
- /**
- * Aws实例
- *
- * @var null
- */
- protected $s3 = null;
- /**
- * Aws constructor.
- *
- * @param array $options
- */
- public function __construct($options = [])
- {
- $this->options = $options;
- try {
- $this->s3 = new AwsS3S3Client([
- ‘version’ => ‘latest’,
- ‘region’ => empty($this->options[‘s3_region’]) ? ‘us-east-1’ : $this->options[‘s3_region’],
- ‘endpoint’ => $this->options[‘s3_endpoint’],
- ‘use_path_style_endpoint’ => true,
- ‘credentials’ => [
- ‘key’ => $this->options[‘s3_key’],
- ‘secret’ => $this->options[‘s3_secret’],
- ],
- ]);
- } catch (Exception $e) {
- $this->error = $e->getMessage();
- }
- }
- /**
- * 创建文件
- *
- * @param $pathname
- * @param $file
- *
- * @return bool
- */
- public function create($pathname, $file)
- {
- try {
- $params = array(
- ‘Bucket’ => $this->options[‘s3_bucket’],
- ‘Key’ => $pathname,
- ‘Body’ => fopen($file, ‘rb’)
- );
- if ($image_type = exif_imagetype($file)) {
- $params[‘ContentType’] = image_type_to_mime_type($image_type);
- }
- $this->s3->putObject($params);
- } catch (Exception $e) {
- $this->error = $e->getMessage();
- return false;
- }
- return true;
- }
- /**
- * 删除文件
- *
- * @param $pathname
- *
- * @return bool
- */
- public function delete($pathname)
- {
- try {
- $this->s3->deleteObject([
- ‘Bucket’ => $this->options[‘s3_bucket’],
- ‘Key’ => $pathname,
- ]);
- } catch (Exception $e) {
- $this->error = $e->getMessage();
- return false;
- }
- return true;
- }
- /**
- * 删除多个文件
- *
- * @param array $list
- * @return bool|mixed
- */
- public function deletes(array $list)
- {
- try {
- $objects = [];
- foreach ($list as $value) {
- $objects[] = [‘Key’ => $value ];
- }
- $this->s3->deleteObjects([
- ‘Bucket’ => $this->options[‘s3_bucket’],
- ‘Objects’ => $objects,
- ]);
- } catch (Exception $e) {
- $this->error = $e->getMessage();
- return false;
- }
- return true;
- }
- public function getError()
- {
- return ‘Aws:’ . $this->error;
- }
- }
复制代码
二、增加aws-sdk-php依赖
- composer require aws/aws-sdk-php -n
复制代码
三、增加存储策略配置,在config/strategy.php 增加一项
- ‘aws’=>[‘name’=>’AWS S3’,’class’=>strategydriverAws::class],
复制代码
四、执行SQL增加配置参数
- INSERT INTO `lsky_config` VALUES (0,’aws’,’text’,’text’,’s3_endpoint’,’Endpoint’,NULL,”,”),(0,’aws’,’text’,’text’,’s3_key’,’Key’,NULL,”,”),(0,’aws’,’text’,’text’,’s3_secret’,’Secret’,NULL,”,”),(0,’aws’,’text’,’text’,’s3_bucket’,’Bucket’,’储存桶名称’,”,”),(0,’aws’,’text’,’text’,’aws_cdn_domain’,’域名’,NULL,”,”);
复制代码
五,在后台设置存储策略,完成
原文:https://www.wellphp.com/2022/02/ … %e6%94%af%e6%8c%81/
觉得有用可以考虑给我打赏 https://shop.cgs.me/buy/1
|