You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

227 lines
7.8 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?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;
}
}
}