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 = ''; 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: 비즈니스 로직 + 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 = ''; 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); } }
시간이 있으면 기능적인 인터페이스로 보완하고 더 많은 클라우드 인터페이스 기능을 풍부하게 할 수 있습니다.
첨부파일:컴포저 패키지: 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 패키지: https://spring-file-storage.xuyanwu.cn/#/ | //spring-file-storage.xuyanwu.cn/#/
추천 학습: "
laravel 비디오 튜토리얼위 내용은 OSS 클라우드 환경에서 파일 업로드 및 서명을 위한 키 코드 공유의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!