兰空图床是一款简单而强大的图床程序,但是目前并不支持minio/s3存储策略,作者计划在2.0版本开发此功能。
然而我不想等了,决定略写几行代码,以支持自建minio后端。有需要的看官可以参考。
大约如下几步:
一、撰写AWS S3存储driver,放到extend/strategy/driver/ 目录下:
<?php
namespace strategy\driver;
use strategy\Driver;
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 strategy\driver
*/
class Aws implements Driver
{
/**
* 当前储存策略参数
*
* @var 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 \Aws\S3\S3Client([
'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'=>\strategy\driver\Aws::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,'','');
五,在后台设置存储策略,完成

附:构建docker参考脚本 docker.zip