146 lines
4.3 KiB
PHP
Raw Normal View History

2024-05-31 09:27:37 +08:00
<?php
/**
* @desc 七牛云OSS适配器
*
* @author Tinywan(ShaoBo Wan)
* @date 2022/3/7 19:54
*/
declare(strict_types=1);
namespace Tinywan\Storage\Adapter;
use Qiniu\Auth;
use Qiniu\Storage\UploadManager;
use Throwable;
use Tinywan\Storage\Exception\StorageException;
class QiniuAdapter extends AdapterAbstract
{
protected $instance = null;
protected $uploadToken = null;
/**
* @desc: 实例
*/
public function getInstance(): ?UploadManager
{
if (!$this->instance) {
$this->instance = new UploadManager();
}
return $this->instance;
}
/**
* @desc: 获取上传令牌
* @return string
* @author Tinywan(ShaoBo Wan)
*/
public function getUploadToken(): string
{
if (!$this->uploadToken) {
$auth = new Auth($this->config['accessKey'], $this->config['secretKey']);
$this->uploadToken = $auth->uploadToken($this->config['bucket']);
}
return $this->uploadToken;
}
/**
* @desc: 上传文件
* @param array $options
* @return array
* @author Tinywan(ShaoBo Wan)
*/
public function uploadFile(array $options = []): array
{
try {
$result = [];
foreach ($this->files as $key => $file) {
$uniqueId = hash_file($this->algo, $file->getPathname());
$saveName = $uniqueId.'.'.$file->getUploadExtension();
$object = $this->config['dirname'].$this->dirSeparator.$saveName;
$temp = [
'key' => $key,
'origin_name' => $file->getUploadName(),
'save_name' => $saveName,
'save_path' => $object,
'url' => $this->config['domain'].$this->dirSeparator.$object,
'unique_id' => $uniqueId,
'size' => $file->getSize(),
'mime_type' => $file->getUploadMineType(),
'extension' => $file->getUploadExtension(),
];
list($ret, $err) = $this->getInstance()->putFile($this->getUploadToken(), $object, $file->getPathname());
if (!empty($err)) {
throw new StorageException((string) $err);
}
array_push($result, $temp);
}
} catch (Throwable $exception) {
throw new StorageException($exception->getMessage());
}
return $result;
}
/**
* @desc: 上传服务端文件
*
* @author Tinywan(ShaoBo Wan)
*/
public function uploadServerFile(string $file_path): array
{
$file = new \SplFileInfo($file_path);
if (!$file->isFile()) {
throw new StorageException('不是一个有效的文件');
}
$uniqueId = hash_file($this->algo, $file->getPathname());
$object = $this->config['dirname'].$this->dirSeparator.$uniqueId.'.'.$file->getExtension();
$result = [
'origin_name' => $file->getRealPath(),
'save_path' => $object,
'url' => $this->config['domain'].$this->dirSeparator.$object,
'unique_id' => $uniqueId,
'size' => $file->getSize(),
'extension' => $file->getExtension(),
];
list($ret, $err) = $this->getInstance()->putFile($this->getUploadToken(), $object, $file->getPathname());
if (!empty($err)) {
throw new StorageException((string) $err);
}
return $result;
}
/**
* 上传Base64.
*/
public function uploadBase64(string $base64, string $extension = 'png'): array
{
$base64 = explode(',', $base64);
$uniqueId = date('YmdHis').uniqid();
$object = $this->config['dirname'].$this->dirSeparator.$uniqueId.'.'.$extension;
list($ret, $err) = $this->getInstance()->put($this->getUploadToken(), $object, base64_decode($base64[1]));
if (!empty($err)) {
throw new StorageException((string) $err);
}
$imgLen = strlen($base64['1']);
$fileSize = $imgLen - ($imgLen / 8) * 2;
return [
'save_path' => $object,
'url' => $this->config['domain'].$this->dirSeparator.$object,
'unique_id' => $uniqueId,
'size' => $fileSize,
'extension' => $extension,
];
}
}