Muat naik dan tandatangan fail OSS
Saya percaya bahawa dalam pembangunan harian, anda sering menggunakan fungsi seperti memuat naik dan memuat turun fail awan, dan Alibaba Cloud dan Huawei Cloud biasanya digunakan di China . Laravel mempunyai Storan yang disertakan tidak mempunyai sokongan mesra secara lalai.
Kebetulan terdapat pelbagai jenis loya semasa proses pemindahan awan baru-baru ini, terutamanya berkaitan antara muka muat naik dan tandatangan. Kod utama untuk memuat naik dan menandatangani fail dalam persekitaran awan OSS direkodkan khas untuk rujukan.
Arahan pemasangan pakej berkaitan:
// 阿里云oss composer require aliyuncs/oss-sdk-php // 华为云obs composer require obs/esdk-obs-php
Sila beri perhatian kepada versi pakej dan sama ada ia boleh digunakan pada versi php.
.env Item konfigurasi:
# 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
Kod:
1
2. Pelaksanaan OSS Alibaba<?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); }
<?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); } }
<?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); } }
<?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; } }
pakej komposer: https://packagist.org/packages/league/flysystem
Pakej mvn musim bunga: https ://spring-file-storage.xuyanwu.cn/#/ |. https://spring-file-storage.xuyanwu.cn/#/composer require league/flysystem
Pembelajaran yang disyorkan: "
tutorial video laravelAtas ialah kandungan terperinci Kongsi kod utama untuk memuat naik dan menandatangani fail dalam persekitaran awan OSS. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!