>  기사  >  PHP 프레임워크  >  OSS 클라우드 환경에서 파일 업로드 및 서명을 위한 키 코드 공유

OSS 클라우드 환경에서 파일 업로드 및 서명을 위한 키 코드 공유

藏色散人
藏色散人앞으로
2023-01-17 14:09:301107검색

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. Huawei OBS 구현

<?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);
    }
}

Demo: 비즈니스 로직 + OSS 클래스

<?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);
    }
}
rrree

시간이 있으면 기능적인 인터페이스로 보완하고 더 많은 클라우드 인터페이스 기능을 풍부하게 할 수 있습니다.

첨부파일:

컴포저 패키지: 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;];
            }
        }
    }
}

Spring mvn 패키지: https://spring-file-storage.xuyanwu.cn/#/ | //spring-file-storage.xuyanwu.cn/#/

추천 학습: "

laravel 비디오 튜토리얼

"

위 내용은 OSS 클라우드 환경에서 파일 업로드 및 서명을 위한 키 코드 공유의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 learnku.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제