一、技术说明
1.ThinkPHP8.0、MySQL8.0、PHP8.2
2.OSS参考文档,点击查看
二、逻辑说明
1.安装SDK
composer require aliyuncs/oss-sdk-php
2.配置访问凭证(此处使用代码嵌入)
// 从环境变量中获取RAM用户的访问密钥(AccessKey ID和AccessKey Secret)。
$accessKeyId = "yourAccessKeyId";
$accessKeySecret = "yourAccessKeySecret";
// 使用代码嵌入的RAM用户的访问密钥配置访问凭证。
$provider = new StaticCredentialsProvider($accessKeyId, $accessKeySecret);
3.封装上传方法
三、核心代码 - OSS上传类
仅作为参考示例,实际以业务需求进行修改
<?php
namespace app\common\library;
use OSS\Core\OssException;
use OSS\Credentials\StaticCredentialsProvider;
use OSS\Http\RequestCore_Exception;
use OSS\OssClient;
/**
* @note OSS上传操作
*/
class OssXl
{
protected string $accessKeyId; // 阿里云AccessKeyId
protected string $accessKeySecret; // 阿里云AccessKeySecret
protected string $endpoint; // 阿里云Oss域名
protected string $bucket; // 阿里云Oss存储空间
protected object $ossClient; // 阿里云Oss客户端
public function __construct()
{
$this->accessKeyId = config('oss.AccessKeyId');
$this->accessKeySecret = config('oss.AccessKeySecret');
$this->endpoint = config('oss.Endpoint');
$this->bucket = config('oss.Bucket');
// 使用代码嵌入安全令牌配置访问凭证。
$provider = new StaticCredentialsProvider($this->accessKeyId, $this->accessKeySecret);
try {
$config = array(
"provider" => $provider,
"endpoint" => $this->endpoint,
);
$this->ossClient = new OssClient($config);
// 设置建立连接的超时时间。
$this->ossClient->setConnectTimeout(300);
// 设置失败请求重试次数。
$this->ossClient->setMaxTries(5);
// 设置Socket层传输数据的超时时间。
$this->ossClient->setTimeout(30);
// 设置是否开启SSL证书校验。
$this->ossClient->setUseSSL(true);
} catch (OssException $e) {
print $e->getMessage();
}
}
/**
* @note 阿里云Oss单文件上传
* @param string $fileName 文件名称
* @param string $filePath 文件地址
* @param string $object 上传文件地址
* @return array
* @throws RequestCore_Exception
*/
public function uploadFile(string $fileName, string $filePath, string $object = 'xs_file'): array
{
$res = [
'msg' => '上传失败!',
'path' => ''
];
// 截取文件后缀
$ext = pathinfo($fileName, PATHINFO_EXTENSION);
$object .= '/' . date('Ymd') . '/' . md5($fileName) . '.' . $ext;
try {
$result = $this->ossClient->uploadFile($this->bucket, $object, $filePath);
$url = $result['info']['url'];
// 截取文件地址,不包含OSS域名,自行进行域名替换即可
if (str_starts_with($url, 'https://')) {
$url = str_replace(config('oss.domain_replace_https'), '', $url);
} elseif (str_starts_with($url, 'http://')) {
$url = str_replace(config('oss.domain_replace_http'), '', $url);
}
$res['msg'] = '上传成功!';
$res['path'] = $url;
return $res;
} catch (OssException $e) {
$res['msg'] = $e->getMessage();
return $res;
}
}
}