标签 s3 下的文章

先申明这个插件不会放出来了,因为他已经不能算是一个真正意义上的插件了,因为懒得对着S3协议重写,以及设置一些变量的关系(laravel用惯了,而且就算之前在用Yii的时候,也大量采用了dotenv),所以,相当于嵌入太深,就自用算了。。。

如果你也有和和一样,typecho是部署在自己的服务器上,而不是虚拟空间的,可以运行composer的,那倒是可以尝试一下
1、composer require league/flysystem-aws-s3-v3
2、composer require vlucas/phpdotenv
基本上只要这两个就完事了
当然还需要在index.php和admin/common.php中引入 vendor和 dotenv

include 'vendor/autoload.php'; //admin中引用的时候,要注意路径
$repository = Dotenv\Repository\RepositoryBuilder::createWithNoAdapters()
                                                 ->addAdapter(Dotenv\Repository\Adapter\EnvConstAdapter::class)
                                                 ->addWriter(Dotenv\Repository\Adapter\PutenvAdapter::class)
                                                 ->immutable()
                                                 ->make();
$dotenv = Dotenv\Dotenv::create($repository, __DIR__);//这里同样要注意
$dotenv->load();

于是你就可以在你的任意代码里开始使用s3的代码了。
为什么非要用flysystem,也是因为他有一个manager的概念,可以直接将所有支持的adapter一起管理起来,比如:local/oss/cos/qiniu,我想到存哪里的时候就存到哪里。

$manager = new \League\Flysystem\MountManager([
                'local' => $this->getLocalAdapter(),
                'oss'   => $this->getOssAdapter(),
                'cos'   => $this->getCosAdapter(),
                'qiniu' => $this->getQiniuAdapter(),
            ]);

在通过扩展upload中对应的handle就可以将文件存到不同的地方了,为了侵入性更小一点,我只触发了其中的三项

//\Typecho\Plugin::factory('Widget_Upload')->uploadHandle = __CLASS__."::upload";
\Typecho\Plugin::factory('Widget_Upload')->deleteHandle = __CLASS__."::delete"; //用于接管删除附件
\Typecho\Plugin::factory('Widget_Upload')->attachmentHandle = __CLASS__."::attachment";//用于上传后显示对应的云存储的网址
//        \Typecho\Plugin::factory('Widget_Upload')->attachmentDataHandle = __CLASS__."::attachmentdata";
\Typecho\Plugin::factory('Widget_Upload')->beforeUpload = __CLASS__."::beforeupload";//在存入数据库前传到云平台
//        \Typecho\Plugin::factory('Widget_Upload')->upload = __CLASS__."::afterUpload";

就这样,一个附件上传到兼容s3协议的云存储就搞定了
目前国内支持S3协议的大致有:oss/cos/bos?/qiniu,国外有r2等,
可能还有一些其他的,但也没有细研究,除了cos的配置和其他有点不太一样外,都是标准协议,可以放心大胆的用