ホームページ >PHPフレームワーク >Laravel >OSS クラウド環境でファイルをアップロードおよび署名するためのキーコードを共有する
OSSファイルのアップロードと署名
日々の開発ではクラウドファイルのアップロードやダウンロード機能をよく使うと思いますが、国内でよく使われているAlibaba CloudやHuawei Cloud、laravelは付属のストレージには、デフォルトではフレンドリーなサポートがありません。
最近のクラウド移行プロセス中に、主にアップロードと署名インターフェイスに関係する、あらゆる種類の嫌な出来事がたまたま起こりました。 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 . Alibaba 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. Huawei 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); } }
デモ: ビジネス ロジック 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
Spring mvn パッケージ: https:/ /spring-file-storage.xuyanwu.cn/#/ | https://spring-file-storage.xuyanwu.cn/#/
推奨学習: 「laravel ビデオ チュートリアル 」
以上がOSS クラウド環境でファイルをアップロードおよび署名するためのキーコードを共有するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。