|
|
<?php
|
|
|
|
|
|
namespace ali\oss;
|
|
|
|
|
|
use OSS\OssClient;
|
|
|
use OSS\Core\OssException;
|
|
|
use think\facade\Request;
|
|
|
|
|
|
class Oss extends Base
|
|
|
{
|
|
|
|
|
|
/**
|
|
|
* 文件上传(简单上传)
|
|
|
* @param string $local_file_path 本地存储路径,填写的时候以'./'开头
|
|
|
* @param string $oss_file_dirname 存放文件的文件夹层级
|
|
|
* @param string $oss_file_name 文件名 object路径为 $file_dirname + '/' + $file_name
|
|
|
* @param boolean $is_delete_file 上传成功之后是否删除源文件(false--不删除 true--删除),本地调试时无法删除
|
|
|
* @date 2022-06-27
|
|
|
*/
|
|
|
function uploadFile($local_file_path, $oss_file_dirname, $oss_file_name = '', $is_delete_file = true)
|
|
|
{
|
|
|
// 上传到OSS的文件没有指定文件名,自动生成
|
|
|
if (empty($oss_file_name)) {
|
|
|
// 文件名为当前微秒加密
|
|
|
$oss_file_name = md5(microtime(true));
|
|
|
|
|
|
// 获取后缀名
|
|
|
$suffix = get_suffix($local_file_path);
|
|
|
|
|
|
// 文件名
|
|
|
$oss_file_name .= '.' . $suffix;
|
|
|
}
|
|
|
|
|
|
// 上传到OSS的文件指定文件名,只需拼接项目文件夹
|
|
|
$object = $this->config['first_directory'] . '/' . $oss_file_dirname . '/' . $oss_file_name;
|
|
|
|
|
|
$options = [];
|
|
|
|
|
|
// 如果上传文件之后需要删除源文件,上传文件时设置回调
|
|
|
if ($is_delete_file) {
|
|
|
$url = [
|
|
|
// callbackUrl为回调服务器地址
|
|
|
'callbackUrl' => Request::domain() . '/index.php/base/oss/platform/Callback/uploadCallback',
|
|
|
// 发起回调时请求body的值,支持OSS系统变量、自定义变量和常量
|
|
|
'callbackBody' => 'bucket=${bucket}&object=${object}&file_path=${x:file_path}',
|
|
|
// 发起回调请求的Content-Type
|
|
|
'callbackBodyType' => 'application/x-www-form-urlencoded'
|
|
|
];
|
|
|
$url = json_encode($url);
|
|
|
|
|
|
// 设置发起回调请求的自定义参数,由Key和Value组成,Key必须以x:开始。会将这些参数和上述的系统参数一起放在POST请求的body中以方便接收回调方获取。
|
|
|
$var = [
|
|
|
'x:file_path' => $local_file_path
|
|
|
];
|
|
|
$var = json_encode($var);
|
|
|
|
|
|
$options = [
|
|
|
OssClient::OSS_CALLBACK => $url,
|
|
|
OssClient::OSS_CALLBACK_VAR => $var
|
|
|
];
|
|
|
}
|
|
|
|
|
|
try {
|
|
|
// 初始化
|
|
|
$ossClient = $this->createClient();
|
|
|
|
|
|
// 上传文件 - 简单上传
|
|
|
$result = $ossClient->uploadFile($this->config['bucket'], $object, $local_file_path, $options);
|
|
|
|
|
|
// 记录日志
|
|
|
$uid = defined('UID') ? UID : '';
|
|
|
platformLog([
|
|
|
'bucket' => $this->config['bucket'],
|
|
|
'object' => $object,
|
|
|
'local_file_path' => $local_file_path,
|
|
|
'is_delete_file' => true
|
|
|
], $result, 'ali_oss_upload_file_uid_' . $uid);
|
|
|
|
|
|
// 返回成功数据
|
|
|
return $result['info'];
|
|
|
} catch (OssException $e) {
|
|
|
// 返回报错
|
|
|
$result['Code'] = 5000;
|
|
|
$result['Message'] = $e->getMessage();
|
|
|
|
|
|
// 记录日志
|
|
|
$uid = defined('UID') ? UID : '';
|
|
|
platformLog([
|
|
|
'bucket' => $this->config['bucket'],
|
|
|
'object' => $object,
|
|
|
'local_file_path' => $local_file_path,
|
|
|
'is_delete_file' => true
|
|
|
], $result, 'ali_oss_upload_file_uid_' . $uid);
|
|
|
|
|
|
// 返回错误数据
|
|
|
return $result;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 将object下载到服务器指定的文件
|
|
|
* @param string $object object(开头没有'/')
|
|
|
* @param string $local_file_url 本地存储路径,填写的时候以'./'开头
|
|
|
* @date 2022-12-08
|
|
|
*/
|
|
|
public function getObject($object, $local_file_url = '')
|
|
|
{
|
|
|
// 判断$object是否为带http连接的全路径
|
|
|
if (strpos($object, 'https://') !== false || strpos($object, 'http://') !== false) {
|
|
|
// 分割字符串
|
|
|
$array = explode('://', $object);
|
|
|
|
|
|
// 获取第1个/之后的字符串即为$object
|
|
|
$index = strpos($array[1], '/');
|
|
|
$object = substr($array[1], $index + 1);
|
|
|
}
|
|
|
|
|
|
// 获取文件后缀名
|
|
|
$suffix = get_suffix($object);
|
|
|
|
|
|
// 没有定义本地存储路径的时候,自动生成文件保存的本地路径
|
|
|
if (!$local_file_url) {
|
|
|
$local_file_url = './temp/' . md5(microtime(true)) . '.' . $suffix;
|
|
|
}
|
|
|
|
|
|
// 没有文件夹则先生成
|
|
|
create_directory($local_file_url);
|
|
|
|
|
|
$options = [
|
|
|
// 指定本地路径
|
|
|
OssClient::OSS_FILE_DOWNLOAD => $local_file_url
|
|
|
];
|
|
|
|
|
|
try {
|
|
|
// 初始化
|
|
|
$ossClient = $this->createClient();
|
|
|
|
|
|
// 下载文件
|
|
|
$result = $ossClient->getObject($this->config['bucket'], $object, $options);
|
|
|
|
|
|
// 记录日志
|
|
|
$uid = defined('UID') ? UID : '';
|
|
|
platformLog([
|
|
|
'bucket' => $this->config['bucket'],
|
|
|
'object' => $object,
|
|
|
'local_file_url' => $local_file_url,
|
|
|
'domain_local_file_url' => Request::domain(true) . substr($local_file_url, 1)
|
|
|
], $result, 'ali_oss_get_object_uid_' . $uid);
|
|
|
|
|
|
// 返回成功数据
|
|
|
return [
|
|
|
// 本地路径
|
|
|
'local_file_url' => $local_file_url,
|
|
|
// 带域名的本地路径
|
|
|
'domain_local_file_url' => Request::domain(true) . substr($local_file_url, 1)
|
|
|
];
|
|
|
} catch (OssException $e) {
|
|
|
// 返回报错
|
|
|
$result['Code'] = 5000;
|
|
|
$result['Message'] = $e->getMessage();
|
|
|
|
|
|
// 记录日志
|
|
|
$uid = defined('UID') ? UID : '';
|
|
|
platformLog([
|
|
|
'bucket' => $this->config['bucket'],
|
|
|
'object' => $object,
|
|
|
'local_file_url' => $local_file_url,
|
|
|
'domain_local_file_url' => Request::domain(true) . substr($local_file_url, 1)
|
|
|
], $result, 'ali_oss_get_object_uid_' . $uid);
|
|
|
|
|
|
// 返回错误数据
|
|
|
return $result;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
/**
|
|
|
* 删除oss文件
|
|
|
* @param string $object object路径,已包含项目文件夹路径
|
|
|
* @date 2022-12-08
|
|
|
*/
|
|
|
function deleteObject($object)
|
|
|
{
|
|
|
// 判断$object是否为带http连接的全路径
|
|
|
if (strpos($object, 'https://') !== false || strpos($object, 'http://') !== false) {
|
|
|
// 分割字符串
|
|
|
$array = explode('://', $object);
|
|
|
|
|
|
// 获取第1个/之后的字符串即为$object
|
|
|
$index = strpos($array[1], '/');
|
|
|
$object = substr($array[1], $index + 1);
|
|
|
}
|
|
|
|
|
|
try {
|
|
|
// 初始化
|
|
|
$ossClient = $this->createClient();
|
|
|
|
|
|
// 删除文件
|
|
|
$result = $ossClient->deleteObject($this->config['bucket'], $object);
|
|
|
|
|
|
// 记录日志
|
|
|
$uid = defined('UID') ? UID : '';
|
|
|
platformLog([
|
|
|
'bucket' => $this->config['bucket'],
|
|
|
'object' => $object
|
|
|
], $result, 'ali_oss_delete_object_uid_' . $uid);
|
|
|
|
|
|
// 返回成功数据
|
|
|
return $result['info'];
|
|
|
} catch (OssException $e) {
|
|
|
// 返回报错
|
|
|
$result['Code'] = 5000;
|
|
|
$result['Message'] = $e->getMessage();
|
|
|
|
|
|
// 记录日志
|
|
|
$uid = defined('UID') ? UID : '';
|
|
|
platformLog([
|
|
|
'bucket' => $this->config['bucket'],
|
|
|
'object' => $object
|
|
|
], $result, 'ali_oss_delete_object_uid_' . $uid);
|
|
|
|
|
|
// 返回错误数据
|
|
|
return $result;
|
|
|
}
|
|
|
}
|
|
|
}
|