174 lines
4.9 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace Extend\Alibaba;
use App\Exception\BusinessException;
use DateTime;
use DateTimeInterface;
use OSS\Core\OssException;
use OSS\OssClient;
/**
* 阿里云oss
*/
class Oss
{
protected array $config;// 系统配置
public function __construct()
{
$this->config = config("alibaba.oss");
}
/**
* 创建客户端
* @return OssClient
*/
public function createClient(): OssClient
{
try {
return new OssClient($this->config['accessKey'], $this->config['accessKeySecret'], $this->config['endpoint']);
} catch (OssException $e) {
throw new BusinessException($e->getMessage());
}
}
/**
* 获取签名
* @param string $dir 用户上传文件时指定的前缀。
* @return array
*/
public function signature(string $dir): array
{
try {
$now = time();
$expire = 30; //设置该policy超时时间是10s. 即这个policy过了这个有效时间将不能访问。
$end = $now + $expire;
$expiration = $this->gmt_iso8601($end);
$start = array(0 => 'starts-with', 1 => '$key', 2 => $dir);
$conditions[] = $start;
$arr = array('expiration' => $expiration, 'conditions' => $conditions);
$policy = json_encode($arr);
$base64_policy = base64_encode($policy);
$string_to_sign = $base64_policy;
$signature = base64_encode(hash_hmac('sha1', $string_to_sign, $this->config['accessKeySecret'], true));
$response = array();
$response['accessid'] = $this->config['accessKey'];
// $response['host'] = "https://" . $this->config['bucket'] . '.' . $this->config['endpoint'];
$response['host'] = config('alibaba.oss.custom_domain_name');
$response['policy'] = $base64_policy;
$response['signature'] = $signature;
$response['expire'] = $end;
$response['callback'] = "";
$response['dir'] = $dir; // 这个参数是设置用户上传文件时指定的前缀。
return $response;
} catch (\Exception $e) {
throw new BusinessException($e->getMessage());
}
}
/**
* @param $time
* @return string
* @throws \Exception
*/
protected function gmt_iso8601($time): string
{
return str_replace('+00:00', '.000Z', gmdate('c', $time));
}
/**
* 上传
* @param string $filename 图片名称
* @param mixed $content 内容 字符串或文件流
* @return string
*/
public function putObject(string $filename, mixed $content): string
{
try {
$ossClient = $this->createClient();
$ossClient->putObject($this->config['bucket'], $filename, $content);
return $filename;
}catch(\Exception $e) {
throw new BusinessException($e->getMessage());
}
}
/**
* 下载自定义风格文件到内存
* @param string $filename
* @param string $style
* @return string
*/
public function getCusTomObjectToRAM(string $filename,string $style = "image/resize"): string
{
try {
$ossClient = $this->createClient();
$options = array(
OssClient::OSS_PROCESS => $style,
);
$object = $filename;
return $ossClient->getObject($this->config['bucket'], $object,$options);
}catch(\Exception $e) {
throw new BusinessException($e->getMessage());
}
}
/**
* 下载文件到内存
* @param string $filename
* @return string
*/
public function getObjectToRAM(string $filename): string
{
try {
$ossClient = $this->createClient();
return $ossClient->getObject($this->config['bucket'], $filename);
}catch(\Exception $e) {
throw new BusinessException($e->getMessage());
}
}
/**
* 下载文件到本地
* @param string $filename
* @param string $local
* @return string
*/
public function getObjectToLocal(string $filename,string $local): string
{
try {
$options = array(
OssClient::OSS_FILE_DOWNLOAD => $local
);
$ossClient = $this->createClient();
return $ossClient->getObject($this->config['bucket'], $filename,$options);
}catch(\Exception $e) {
throw new BusinessException($e->getMessage());
}
}
/**
* 判断指定的文件是否存在
* @param string $filename
* @return bool
*/
public function doesObjectExist(string $filename): bool
{
try {
$ossClient = $this->createClient();
return $ossClient->doesObjectExist($this->config['bucket'], $filename);
}catch(\Exception $e) {
throw new BusinessException($e->getMessage());
}
}
}