優雅的 Oss Flysystem 擴充套件

Destiny發表於2018-12-30

file

先上鍊接

如果覺得幫助了你,節省了你的時間記得 Star 喲.

序言

之前用過很多 oss 擴充套件包但是暫時沒有一個用的順心的,一些擴充套件包配置太複雜,還有的擴充套件包不能整合 Laravel 檔案驅動,對於喜歡優雅編碼的同學可能不能忍受

最近閒下來看了一些優秀的開源專案,從中學到不少東西。看了超哥的 overtrue/flysystem-qiniu 後決定自己也寫一個 oss 擴充套件包.

要求

  • PHP >= 7.0

第一個擴充套件包:直接使用不依賴框架

$ composer require "iidestiny/flysystem-oss" -vvv

配置

use League\Flysystem\Filesystem;
use Iidestiny\Flysystem\Oss\OssAdapter;
use Iidestiny\Flysystem\Oss\Plugins\FileUrl;

$accessKeyId = 'xxxxxx';
$accessKeySecret = 'xxxxxx';
$endpoint= 'oss.iidestiny.com';
$bucket = 'bucket';
$isCName = true; // 如果 isCname 為 false,endpoint 應配置 oss 提供的域名如:`oss-cn-beijing.aliyuncs.com`,cname 或 cdn 請自行到阿里 oss 後臺配置並繫結 bucket

$adapter = new OssAdapter($accessKeyId, $accessKeySecret, $endpoint, $bucket, $isCName);

$flysystem = new Filesystem($adapter);

API

bool $flysystem->write('file.md', 'contents');

bool $flysystem->write('file.md', 'http://httpbin.org/robots.txt', ['options' => ['xxxxx' => 'application/redirect302']]);

bool $flysystem->writeStream('file.md', fopen('path/to/your/local/file.jpg', 'r'));

bool $flysystem->update('file.md', 'new contents');

bool $flysystem->updateStream('file.md', fopen('path/to/your/local/file.jpg', 'r'));

bool $flysystem->rename('foo.md', 'bar.md');

bool $flysystem->copy('foo.md', 'foo2.md');

bool $flysystem->delete('file.md');

bool $flysystem->has('file.md');

string|false $flysystem->read('file.md');

array $flysystem->listContents();

array $flysystem->getMetadata('file.md');

int $flysystem->getSize('file.md');

string $flysystem->getAdapter()->getUrl('file.md'); 

string $flysystem->getMimetype('file.md');

int $flysystem->getTimestamp('file.md');

Plugins

use Iidestiny\Flysystem\Oss\Plugins\FileUrl

$flysystem->addPlugin(new FileUrl());

string $flysystem->getUrl('file.md');

// 獲取檔案 url 地址
$flysystem->addPlugin(new SignUrl());

// 使用簽名 url 進行臨時授權訪問
string $flysystem->signUrl('file.md', $timeout);

前端 web 直傳配置

oss 直傳有三種方式,當前擴充套件包使用的是最完整的 服務端簽名直傳並設定上傳回撥 方式,擴充套件包只生成前端頁面上傳所需的簽名引數,前端上傳實現可參考 官方文件中的例項 或自行搜尋

use Iidestiny\Flysystem\Oss\Plugins\SignatureConfig

$flysystem->addPlugin(new SignatureConfig());

object $flysystem->signatureConfig($prefix, $callBackUrl, $expire);

第二個擴充套件包:專門為 Laravel 適配

該擴充套件包內部自動依賴了 iidestiny/flysystem-oss 所以兩個包不需要重複安裝,Laravel 使用者直接使用下面這條語句安裝就可以.

$ composer require "iidestiny/laravel-filesystem-oss" -vvv

配置

config/filesystems.php 新增 oss 配置

 <?php

 return [
    'disks' => [
         //...
         'oss' => [
             'driver' => 'oss',
             'access_key' => env('OSS_ACCESS_KEY'),
             'secret_key' => env('OSS_SECRET_KEY'),
             'endpoint'   => env('OSS_ENDPOINT'),
             'bucket'     => env('OSS_BUCKET'),
             'isCName'    => env('OSS_IS_CNAME', false), // 如果 isCname 為 false,endpoint 應配置 oss 提供的域名如:`oss-cn-beijing.aliyuncs.com`,否則為自定義域名,,cname 或 cdn 請自行到阿里 oss 後臺配置並繫結 bucket
         ],
         //...
     ]
 ];

使用

<?php

$disk = Storage::disk('oss');

// create a file
$disk->put('avatars/filename.jpg', $fileContents);

// check if a file exists
$exists = $disk->has('file.jpg');

// get timestamp
$time = $disk->lastModified('file1.jpg');
$time = $disk->getTimestamp('file1.jpg');

// copy a file
$disk->copy('old/file1.jpg', 'new/file1.jpg');

// move a file
$disk->move('old/file1.jpg', 'new/file1.jpg');

// 獲取檔案內容
$contents = $disk->read('folder/my_file.txt');

// 獲取檔案 url
$url = $disk->getUrl('folder/my_file.txt');

// 使用簽名 url 進行臨時授權訪問
$url = $disk->signUrl('file.md', $timeout);

// web 直傳所需簽名引數
$config = $disk->signatureConfig($prefix, $callBackUrl, $expire);

更多方法檢視 Laravel 文件 laravel-filesystem-doc

擴充套件包開發參考

最新更新

請到擴充套件包檢視 Readme

將來的你一定會感謝現在努力的自己!

相關文章