Heim >PHP-Framework >Laravel >Teilen Sie Schlüsselcodes zum Hochladen und Signieren von Dateien in der OSS-Cloud-Umgebung
OSS-Datei-Upload und -Signatur
Ich glaube, dass Sie in der täglichen Entwicklung häufig Funktionen wie das Hochladen und Herunterladen von Cloud-Dateien verwenden. Die häufig verwendete inländische Alibaba Cloud und Huawei Cloud, Laravels eigener Speicher, bieten jedoch keine freundliche Unterstützung standardmäßig.
Es ist einfach so passiert, dass es während des jüngsten Cloud-Migrationsprozesses allerlei widerliche Dinge gab, hauptsächlich im Zusammenhang mit der Upload- und Signaturschnittstelle. Die Schlüsselcodes zum Hochladen und Signieren von Dateien in der OSS-Cloud-Umgebung werden speziell zu Referenzzwecken aufgezeichnet.
Verwandter Paketinstallationsbefehl:
// 阿里云oss composer require aliyuncs/oss-sdk-php // 华为云obs composer require obs/esdk-obs-php
Bitte achten Sie auf die Paketversion und darauf, ob sie auf die PHP-Version anwendbar ist.
.env Konfigurationselemente:
# 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. Schnittstellendeklaration
<?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); }3. Huawei OBS-Implementierung
<?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); } }Demo: Geschäftslogik + OSS-Klasse
<?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); } }rrree Wenn Sie Zeit haben, können Sie es mit funktionalen Schnittstellen ergänzen und weitere Cloud-Schnittstellenfunktionen bereichern.
Anhang:
Composer-Paket: https://packagist.org/packages/league/flysystem<?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' => '无效文件!']; } } } }Spring MVN-Paket: https://spring-file-storage.xuyanwu.cn/#/ |. //spring-file-storage.xuyanwu.cn/#/Empfohlenes Lernen: „
Laravel-Video-Tutorial
“Das obige ist der detaillierte Inhalt vonTeilen Sie Schlüsselcodes zum Hochladen und Signieren von Dateien in der OSS-Cloud-Umgebung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!