概述
在开发稍微复杂一点的网站时不能避免的一个问题是如何处理大量的附件,将附件托管在云上无疑是一个很好的选择,运营和维护成本都很低。可以让你潇洒的跳过附件维护这个坑。你不用再关心应该给服务器配置多大的硬盘来保存附件,不用再精打细算节约硬盘空间,也不用在担心附件集中下载影响服务器的带宽。如果你需要还可以方便的配置CDN加速,大幅提升用户体验。主流的附件托管服务就是aws s3和aliyun oss。这两个的价格基本差不多,基本都是0.1元/GB/月。相对于服务器的成本,这基本可以忽略了。本文只针对aws s3展开,并不涉及aliyun oss,有需要的同学可以自行查看oss文档,原理基本一样。
准备工作
首先你需要创建aws账号,并配置好安全凭证。请参考这里。
安装AWS SDK,按照文档介绍的来就行,只是使用composer安装sdk时会比较慢,等等就好了。
准备工作都做好了,可以开始码代码了。
自定义s3Attachment组件
如果你还不知道yii2中应该如何自定义组件请参考这里。
我们自定义s3组件的目的是将上传,删除等基本功能封装好,需要的地方直接调用就行。参考s3文档示例代码,简单修改下就能正常使用了。
<?php
namespace common\components;
use Yii;
use Yii\base\Exception;
use yii\base\Component;
use Aws\Sdk;
use Aws\Exception\AwsException;
use Aws\Exception\MultipartUploadException;
class s3Attachment extends Component
{
/*
* 常规上传附件
*
* @param string $bucket 存储桶名称.
* @param string $key 附件公网访问地址.
* @param string $source_file 待上传的附件.
* @param string $content_type 附件类型.
* @param string $ACL 访问控制.
* 如果上传成功返回公网访问地址,如果上传失败返回false.
*/
public function Upload($bucket, $key, $source_file, $content_type, $ACL)
{
if(empty($bucket) || empty($key) || empty($source_file) || empty($content_type) || empty($ACL)){
return false;
}
try{
$config = [
&