一 七牛库,安装及例子.
- 安装
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 测试 。
查看上传效果 。
二 上传例子
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>
上传后例子。