本文小编为大家详细介绍“OSS云环境文件上传与签名的代码怎么写”,内容详细,步骤清晰,细节处理妥当,希望这篇“OSS云环境文件上传与签名的代码怎么写”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。
OSS文件上传与签名
相关包安装命令:
// 阿里云oss
composer require aliyuncs/oss-sdk-php
// 华为云obs
composer require obs/esdk-obs-php
需注意包版本,是否与 php 版本适用。
.env 配置项:
# OSS相关配置
OSS_DRIVER=HW_OBS
#华为OBS
OSS_HW_ENDPOINT=https://obs.cn-east-3.myhuaweicloud.com
OSS_HW_KEY=ME0AVBTNJTSJB2LH0EGI
OSS_HW_SECRET=eCGffrwdx3Rt5QEmKbtEvruvGgg1mCUjMsnHfjWo
OSS_HW_BUCKET=pub-obs-test-1
#阿里云
OSS_ENDPOINT=https://oss-cn-hangzhou.aliyuncs.com
OSS_KEYID=LTAI4Ftno9DsfiVHADX73osa
OSS_KEYSECRET=vo9KuqgaDN727eOOz1tDg77Egeg7wE
OSS_BUCKET=xgimi-ipr
代码:
1. 接口声明
<?php
namespace App\Service\OSS;
interface IOSS
{
/**
* 上传
*
* @param $fullFileName
* @param $filePath
* @return mixed
*/
public function publicUpload($fullFileName, $filePath);
/**
* url验签、下载
*
* @param $fullFileName | 含前缀的完整url文件名
* @param $expires | 过期时效
* @return mixed
*/
public function getUrl($fullFileName, $expires);
/**
* 可替换url域名
*
* @param $url
* @return mixed
*/
public function replaceUrl($url);
}
2. 阿里 OSS 实现
<?php
namespace App\Service\OSS;
use OSS\OssClient;
class AliOSS implements IOSS
{
private $endPoint;
private $keyId;
private $secret;
private $bucket;
private $ossClient;
private $expires = 3 * 24 * 3600;
private $aliHost = '';
private $myHost = '';
public function __construct()
{
$this->endPoint = env("OSS_ENDPOINT");
$this->keyId = env("OSS_KEYID");
$this->secret = env("OSS_KEYSECRET");
$this->bucket = env("OSS_BUCKET");
try {
$this->ossClient = new OssClient($this->keyId, $this->secret, $this->endPoint);
} catch (\Exception $e) {
}
}
/**
* 上传
*
* @param $fullFileName
* @param $filePath
* @return mixed
* @throws \Exception
*/
public function publicUpload($fullFileName, $filePath)
{
return $this->ossClient->uploadFile($this->bucket, $fullFileName, $filePath);
}
/**
* url验签、下载
*
* @param $fullFileName
* @param $expires | 过期时效
* @return mixed
* @throws \Exception
*/
public function getUrl($fullFileName, $expires)
{
$expires = $expires ? $expires : $this->expires;
$signUrl = $this->ossClient->signUrl($this->bucket, $fullFileName, $expires);
return $signUrl;
}
/**
* 替换url域名
*
* @param $url
* @return mixed
*/
public function replaceUrl($url)
{
return str_replace($this->aliHost, $this->myHost, $url);
}
}
3. 华为 OBS 实现
<?php
namespace App\Service\OSS;
use Obs\ObsClient;
class HuaweiOBS implements IOSS
{
private $endPoint;
private $key;
private $secret;
private $bucket;
private $obsClient;
private $expires = 3 * 24 * 3600;
private $hwHost = '';
private $myHost = '';
public function __construct()
{
$this->endPoint = env("OSS_HW_ENDPOINT");
$this->key = env("OSS_HW_KEY");
$this->secret = env("OSS_HW_SECRET");
$this->bucket = env("OSS_HW_BUCKET");
try {
$this->obsClient = new ObsClient(['key' => $this->key, 'secret' => $this->secret, 'endpoint' => $this->endPoint]);
} catch (\Exception $e) {
}
}
/**
* 上传
*
* @param $fullFileName
* @param $filePath
* @return mixed
*/
public function publicUpload($fullFileName, $filePath)
{
$res = $this->obsClient->putObject([
'Bucket' => $this->bucket,
'Key' => $fullFileName,
'SourceFile' => $filePath
]);
return $res;
}
/**
* url验签、下载
*
* @param $fullFileName
* @param $expires | 过期时效
* @return mixed
* @throws \Exception
*/
public function getUrl($fullFileName, $expires)
{
$expires = $expires ? $expires : $this->expires;
// 生成下载对象的带授权信息的URL
$res = $this->obsClient->createSignedUrl([
'Method' => 'GET',
'Bucket' => $this->bucket,
'Key' => $fullFileName,
'Expires' => $expires
]);
return $res['SignedUrl'];
}
/**
* 替换url域名
*
* @param $url
* @return mixed
*/
public function replaceUrl($url)
{
return str_replace($this->hwHost, $this->myHost, $url);
}
}
Demo: 业务逻辑 + OSS 类
<?php
namespace App\Service;
class UploadFile
{
/**
* 文件上传 带签名访问
*
* @param $files
* @param string $prefix
* @return array
* @throws \Exception
*/
public static function upload($files, $prefix = '')
{
if (empty($files)) {
return ['ok' => false, 'message' => '请上传文件!'];
}
if (is_array($files)) {
$pics = [];
foreach ($files as $key => $file) {
if ($file->isValid()) {
$name = $file->getClientOriginalName();
$fullName = OSS::getFullFileName($name, $prefix);
$ret = OSS::publicUpload($fullName, $file, $prefix);
if ($ret) {
$url = OSS::getUrl($fullName);
$url = OSS::replaceUrl($url);
$pics[] = ['name' => $name, 'url' => $url, 'file_name' => $fullName];
}
} else {
return ['ok' => false, 'message' => '无效文件!'];
}
}
if (count($pics) > 0) {
return ['ok' => true, 'data' => $pics];
}
} else {
$name = $files->getClientOriginalName();
$fullName = OSS::getFullFileName($name, $prefix);
$ret = OSS::publicUpload($fullName, $files, $prefix);
if ($ret) {
$url = OSS::getUrl($fullName);
$url = OSS::replaceUrl($url);
return ['ok' => true, 'data' => ['name' => $name, 'url' => $url, 'file_name' => $fullName]];
} else {
return ['ok' => false, 'message' => '无效文件!'];
}
}
}
}
<?php
namespace App\Service;
use App\Service\OSS\AliOSS;
use App\Service\OSS\HuaweiOBS;
use Exception;
class OSS
{
const DEFAULT_DRIVER = 'HW_OBS';
const OSS_PREFIX = 'oss/';
public $OSSService;
/**
* 初始化 service
*/
public function __construct()
{
if (env('OSS_DRIVER') === self::DEFAULT_DRIVER) {
$this->OSSService = new HuaweiOBS();
} else {
$this->OSSService = new AliOSS();
}
}
public static function getInstance()
{
return new self();
}
/**
* 使用外网上传文件
*
* @param $fullName
* @param $filePath
* @param $prefix
* @return mixed
* @throws Exception
*/
public static function publicUpload($fullName, $filePath, $prefix)
{
return self::getInstance()->OSSService->publicUpload($fullName, $filePath);
}
/**
* 获取oss图片url
*
* @param $fullName
* @param $expires | 过期时效
* @return string
* @throws Exception
*/
public static function getUrl($fullName, $expires = '')
{
return self::getInstance()->OSSService->getUrl($fullName, $expires);
}
/**
* 替换url域名
*
* @param $url
* @return mixed
*/
public static function replaceUrl($url)
{
return self::getInstance()->OSSService->replaceUrl($url);
}
/**
* 获取完整的文件名含路径
*
* @param $fileName
* @param $prefix
* @return string
*/
public static function getFullFileName($fileName, $prefix)
{
return self::OSS_PREFIX . $prefix . self::setFileName($fileName);
}
/**
* 设置新的文件名(重命名规则)
*
* @param $fileName
* @return string
*/
public static function setFileName($fileName)
{
$nameArray = explode('.', $fileName);
$extension = $nameArray[count($nameArray) - 1];
$newName = date('Ymd') . '/' . date('YmdHis') . rand(10000, 99999) . '.' . $extension;
return $newName;
}
}
有时间可以对其进行功能接口补充,丰富更多云接口能力。
附:
composer 包:https://packagist.org/packages/league/flysystem
composer require league/flysystem
读到这里,这篇“OSS云环境文件上传与签名的代码怎么写”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。