九 【实战】 hyperf 七牛上传

492 阅读1分钟

一 七牛库,安装及例子.

  1. 安装
 composer require qiniu/php-sdk

2 配置 。 修

#QN 配置
QN_AK=ak
QN_SK=sk
QN_BUCKET=xxx

写service 用于创建 uploadManage,getToken createBm 等 。

<?php
namespace App\Service;

use Qiniu\Auth;
use Qiniu\Storage\BucketManager;
use Qiniu\Storage\UploadManager;

class QnService
{

    public function createBm()
    {
        $accessKey =  env('QN_AK');
        $secretKey =  env('QN_SK');
        //初始化Auth状态
        $auth = new Auth($accessKey, $secretKey);
        //初始化BucketManager
        $bucketMgr = new BucketManager($auth);
        return $bucketMgr;
    }

    public function getUploadToken()
    {
        $accessKey =  env('QN_AK');
        $secretKey =  env('QN_SK');
        //初始化Auth状态
        $auth = new Auth($accessKey, $secretKey);
        $bucket_name = env("QN_BUCKET");
        return $auth->uploadToken($bucket_name);
    }

    public function createUploadManager()
    {
        return new UploadManager();
    }
}

控制器例子

    #[Inject]
    protected QnService $qnService;
    public function upload()
    {
        echo "test-upload";
        $uploadMgr =  $this->qnService->createUploadManager();
        $token = $this->qnService->getUploadToken();

        $filePath = "/tmp/1.log";
        $key = date("YmdHis");

// 调用 UploadManager 的 putFile 方法进行文件的上传。
        list($ret, $err) = $uploadMgr->putFile($token, $key, $filePath, null, 'application/octet-stream', true, null, 'v2');
        echo "\n====> putFile result: \n";
        if ($err !== null) {
            var_dump($err);
        } else {
            var_dump($ret);
        }

        return ["key" => $ret['key']];
    }

直接用postman 测试 。

image.png

查看上传效果 。 image.png

二 上传例子

2.1 设置配置。

'qn_base' => env('UPLOAD_BASE_DIR', 'hyperf/upload/'),

2.2 后端

    #[Value('qn_base')]
    private $qn_base;

    #[Inject]
    protected QnService $qnService;

    public function upload()
    {
        $file = $this->request->file('file');
        $data = $file->toArray();
        $uploadMgr = $this->qnService->createUploadManager();
        $token     = $this->qnService->getUploadToken();

        $key      = $this->qn_base . date("YmdHis") . mt_rand(1000, 9999) . "." . $file->getExtension();
        $filePath = $data['tmp_file'];
        // 调用 UploadManager 的 putFile 方法进行文件的上传。
        list($ret, $err) = $uploadMgr->putFile($token, $key, $filePath, null, 'application/octet-stream', true, null, 'v2');

        if ($err !== null) {
            return $this->code(ErrorCode::UPLOAD_ERROR, $err);
        } else {
            return $this->code(ErrorCode::SUCCESS, array_merge(['key' => $key], $ret));
        }
    }
}

2.3 前端调整。

        <el-upload
            class="upload-demo"
            drag
            :action="upload_url"
            multiple
            :on-change="handle"
        >
            <el-icon class="el-icon--upload"><upload-filled /></el-icon>
            <div class="el-upload__text">
                将文件拖到此处,或
                <em>点击上传</em>
            </div>
        </el-upload>
        
        
 <script setup lang="ts">

const upload_url = 	import.meta.env.VITE_BASE_URL + "/upload"
	
const handle = (rawFile: any) => {
    console.log(rawFile);
};
</script>
       

上传后例子。 image.png