使用七牛云完成博客图片存储-PHP版

问题

图片存储在服务器上,保存逻辑简单。但是一旦服务器需要变更,存储的图片导出就比较费时费力了。所以想借用七牛云做图片服务器,不仅减少了自身服务器请求,也无需考虑迁移的问题。

文件上传流程

共有两种方式:
一、前端上传图片(略)
二、后端上传图片

  1. 页面通过表单提交图片
  2. 后端获取authToken(上传鉴权)
  3. 将临时保存的图片上传到服务器
  4. 服务器返回保存结果

开发步骤:

  1. 注册七牛账号获取秘钥(跳过)
    https://portal.qiniu.com/user/key
    AccessKey . SecretKey 合称为七牛云的密钥
  2. 新建存储空间(跳过)
    https://portal.qiniu.com/bucket
    需要注意:新建完空间后,七牛会分配一个域名。通过此域名加你的文件地址,外网就能直接访问你的资源。但是每个测试域名自创建起 30 个自然日后系统会自动回收,仅供测试使用。所以要计时配上自己的域名,才能保证你的图片访问不会出现问题哦。
  3. 下载PHP SDK
    https://developer.qiniu.com/sdk#official-sdk
    选择开发语言的SDK,以下都是PHP版SDK
    3.1 通过composer 安装
    # windows
    php composer.phar require qiniu/php-sdk
    # linux
    composer require qiniu/php-sdk
    
  4. 封装上传方法
    4.1 所有操作都需要authToken,使用单例

use think\Config;
// 引入鉴权类
use Qiniu\Auth;

class QiniuAuth
{
    static private $auth;  // 七牛鉴权
    private function __construct()
    {
    }

    private function __clone()
    {
    }

    public static function getInstance()
    {
        if (!self::$auth) {
            $accessKey = Config::get('QINIU_ACCESS_KEY');
            $secretKey = Config::get('QINIU_SECRET_KEY');
            self::$auth = new Auth($accessKey, $secretKey);
        }
        return self::$auth;
    }
}

4.2 一下封装了上传接口和读取文件列表接口


use think\Config;

// 引入上传类
use Qiniu\Storage\UploadManager;
use Qiniu\Storage\BucketManager;
class Qiniu
{
    private $auth;
    private $bucket;

    /**
     * Qiniu constructor.
     * @param bool $openBucket 是否为公开空间
     */
    function __construct($openBucket=true)
    {
        $this->auth = QiniuAuth::getInstance();
        $this->bucket = Config::get('QINIU_BUCKET');	// 存储空间名称
    }

    /**
     * 获取空间中文件列表
     *
     * @param string $prefix    要列取文件的公共前缀
     * @param string $marker    上次列举返回的位置标记,作为本次列举的起点信息。
     * @param int $limit        本次列举的条目数
     */
    public function getBucketFileList($prefix='', $marker='', $limit = 20)
    {
        $bucketManager = new BucketManager($this->auth);
        $delimiter = '/';
        // 列举文件
        list($ret, $err) = $bucketManager->listFiles($this->bucket, $prefix, $marker, $limit, $delimiter);
        if ($err !== null) {
            return [];
        } else {
            return $ret;
        }
    }


    /**
     * 上传文件到七牛
     * @param $key          上传文件名
     * @param $filePath     上传文件的路径
     * @param null $params  自定义变量,规格参考 http://developer.qiniu.com/docs/v6/api/overview/up/response/vars.html#xvar
     * @param string $mime  上传数据的mimeType
     * @param bool $checkCrc    是否校验crc32
     * @return array        包含已上传文件的信息,类似:
     *  [
     *      "hash" => "",
     *      "key" => ""
     *  ]
     * @throws \Exception
     */
    public function putFile(
        $key,
        $filePath,
        $params = null,
        $mime = 'application/octet-stream',
        $checkCrc = false)
    {
        // 初始化 UploadManager 对象
        $uploadMgr = new UploadManager();
        // 生成上传 Token
        $upToken = $this->auth->uploadToken($this->bucket);
        return $uploadMgr->putFile($upToken, $key, $filePath, $params, $mime, $checkCrc);
    }
}

开发中遇到的问题:

读取空间文件,不会返回所有文件个数。例如:读取前10个文件,接口返回列表和一个标记符marker,第二次请求需要带上marker才能读取第11-20个文件。

你可能感兴趣的:(PHP)