Heim > PHP-Framework > Laravel > Teilen Sie Schlüsselcodes zum Hochladen und Signieren von Dateien in der OSS-Cloud-Umgebung

Teilen Sie Schlüsselcodes zum Hochladen und Signieren von Dateien in der OSS-Cloud-Umgebung

藏色散人
Freigeben: 2023-01-17 14:09:30
nach vorne
1168 Leute haben es durchsucht

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
Nach dem Login kopieren

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
Nach dem Login kopieren

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);
}
Nach dem Login kopieren

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 = &#39;&#39;;
    private $myHost = &#39;&#39;;
    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);
    }
}
Nach dem Login kopieren

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 = &#39;&#39;;
    private $myHost = &#39;&#39;;
    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([&#39;key&#39; => $this->key, &#39;secret&#39; => $this->secret, &#39;endpoint&#39; => $this->endPoint]);
        } catch (\Exception $e) {
        }
    }
    /**
     * 上传
     *
     * @param $fullFileName
     * @param $filePath
     * @return mixed
     */
    public function publicUpload($fullFileName, $filePath)
    {
        $res = $this->obsClient->putObject([
            &#39;Bucket&#39; => $this->bucket,
            &#39;Key&#39; => $fullFileName,
            &#39;SourceFile&#39; => $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([
            &#39;Method&#39; => &#39;GET&#39;,
            &#39;Bucket&#39; => $this->bucket,
            &#39;Key&#39; => $fullFileName,
            &#39;Expires&#39; => $expires
        ]);
        return $res[&#39;SignedUrl&#39;];
    }
    /**
     * 替换url域名
     *
     * @param $url
     * @return mixed
     */
    public function replaceUrl($url)
    {
        return str_replace($this->hwHost, $this->myHost, $url);
    }
}
Nach dem Login kopieren
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 = &#39;&#39;)
    {
        if (empty($files)) {
            return [&#39;ok&#39; => false, &#39;message&#39; => &#39;请上传文件!&#39;];
        }
        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[] = [&#39;name&#39; => $name, &#39;url&#39; => $url, &#39;file_name&#39; => $fullName];
                    }
                } else {
                    return [&#39;ok&#39; => false, &#39;message&#39; => &#39;无效文件!&#39;];
                }
            }
            if (count($pics) > 0) {
                return [&#39;ok&#39; => true, &#39;data&#39; => $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 [&#39;ok&#39; => true, &#39;data&#39; => [&#39;name&#39; => $name, &#39;url&#39; => $url, &#39;file_name&#39; => $fullName]];
            } else {
                return [&#39;ok&#39; => false, &#39;message&#39; => &#39;无效文件!&#39;];
            }
        }
    }
}
Nach dem Login kopieren
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!

Verwandte Etiketten:
oss
Quelle:learnku.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage