fastadmin将图片上传至cos对象存储


首先需要在项目里使用composer安装qcloud/cos-sdk-v5库。

composer require qcloud/cos-sdk-v5

然后需要写一个公共的上传本地文件到cos的方法。

/**
 * 上传文件到cos
 * @param string $file 文件
 * @param string $key 文件名称,完整路径
 * @return false|string
 */
function uploadCos($file, $key = '')
{
    if (!file_exists($file)) {
        return false;
    }
    $body = file_get_contents($file);
    if (empty($body)) {
        $body = '';
    }
    if (empty($key)) {
        $key = md5($file);
    }
    $region = Env::get('cos.region');
    $secret_id = Env::get('cos.secret_id');
    $secret_key = Env::get('cos.secret_key');
    $bucket = Env::get('cos.bucket');
    if (empty($region) || empty($secret_id) || empty($secret_key) || empty($bucket)) {
        return false;
    }
    $cosClient = new Qcloud\Cos\Client(array(
        'region' => $region,
        'credentials' => array(
            'secretId' => $secret_id,
            'secretKey' => $secret_key
        )
    ));
    try {
        $result = $cosClient->putObject(
            array(
                'Bucket' => $bucket,
                'Key' => $key,
                'Body' => $body
            )
        );
        if (!empty($result['Location'])) {
            if (!preg_match('/^http/i', $result['Location'])) {
                $result['Location'] = 'https://' . $result['Location'];
            }
            return $result['Location'];
        }
    } catch (\Exception $e) {

    }
    return false;
}

你可以在fastadmin中找到以下行为代码。

\think\Hook::listen("upload_after", $attachment);

所以,我们只需要监听那个行为事件即可。当然,如果你是自己实现的上传方法,也可以直接调用云存储方法或者调用上面的行为代码。

修改application/tags.php文件,增加以下代码

'upload_after'      => [
    'app\\common\\behavior\\Upload',
],

然后编写行为执行代码,文件位置为:application/common/behavior/Upload.php

<?php

namespace app\common\behavior;
class Upload
{
    /**
     * 上传文件到cos
     * @param $params
     * @return void
     */
    public function run(&$params)
    {
        if (!empty($params->url)) {
            if (file_exists(ROOT_PATH . 'public' . $params->url)) {
                $result = uploadCos(ROOT_PATH . 'public' . $params->url, $params->url);
                if (!empty($result)) {
                    $params->url = $result;
                }
            }
        }
    }
}