鍍金池/ 教程/ PHP/ 文件系統(tǒng)/云存儲
門面
Laravel Homestead
安裝及配置
測試
HTTP 中間件
加密
升級指南
幫助函數(shù)
應(yīng)用目錄結(jié)構(gòu)
集合
新手入門指南-簡單任務(wù)管理系統(tǒng)
任務(wù)調(diào)度
查詢構(gòu)建器
視圖
驗證
Laravel Cashier(訂購&支付&發(fā)票)
本地化
隊列
調(diào)整器
分頁
文件系統(tǒng)/云存儲
貢獻(xiàn)代碼
哈希
HTTP 控制器
緩存
遷移
HTTP 請求
Laravel Elixir
發(fā)行版本說明
Envoy 任務(wù)運行器(SSH任務(wù))
序列化
Session
起步
帶用戶功能的任務(wù)管理系統(tǒng)
起步
用戶授權(quán)
郵件
事件
填充數(shù)據(jù)
HTTP 路由
服務(wù)提供者
Blade 模板引擎
包開發(fā)
用戶認(rèn)證
Artisan 控制臺
HTTP 響應(yīng)
集合
服務(wù)容器
關(guān)聯(lián)關(guān)系
一次請求的生命周期
契約
Redis
錯誤&日志

文件系統(tǒng)/云存儲

1、簡介

基于 Frank de JongePHPFlysystem,Laravel提供了強(qiáng)大的文件系統(tǒng)抽象。Laravel文件系統(tǒng)集成提供了使用驅(qū)動處理本地文件系統(tǒng)的簡單使用,這些驅(qū)動包括 Amazon S3,以及 Rackspace云存儲。更好的是在這些存儲選項間切換非常簡單,因為對每個系統(tǒng)而言,API 是一樣的。

2、配置

文件系統(tǒng)配置文件位于 config/filesystems.php。在該文件中可以配置所有”硬盤“,每個硬盤描述了特定的存儲驅(qū)動和存儲位置。為每種支持的驅(qū)動的示例配置包含在該配置文件中,所以,簡單編輯該配置來反映你的存儲參數(shù)和認(rèn)證信息。

當(dāng)然,你想配置磁盤多少就配置多少,多個磁盤也可以共用同一個驅(qū)動。

2.1 本地驅(qū)動

使用 local驅(qū)動的時候,注意所有文件操作相對于定義在配置文件中的 root目錄,默認(rèn)情況下,該值設(shè)置為 storage/app目錄,因此,下面的方法將會存儲文件到 storage/app/file.txt

Storage::disk('local')->put('file.txt', 'Contents');

2.2 其它驅(qū)動預(yù)備知識

在使用 Amazon S3Rackspace驅(qū)動之前,需要通過 Composer安裝相應(yīng)的包:

  • Amazon S3: league/flysystem-aws-s3-v3 ~1.0
  • Rackspace: league/flysystem-rackspace ~1.0

3、基本使用

3.1 獲取硬盤實例

Storage門面用于和你配置的所有磁盤進(jìn)行交互,例如,你可以使用該門面上的 put方法來存儲頭像到默認(rèn)磁盤,如果你調(diào)用 Storage門面上的方法卻先調(diào)用 disk方法,該方法調(diào)用自動傳遞到默認(rèn)磁盤:

<?php

namespace App\Http\Controllers;

use Storage;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class UserController extends Controller{
    /**
     * 更新指定用戶頭像
     *
     * @param  Request  $request
     * @param  int  $id
     * @return Response
     */
    public function updateAvatar(Request $request, $id)
    {
        $user = User::findOrFail($id);

        Storage::put(
            'avatars/'.$user->id,
            file_get_contents($request->file('avatar')->getRealPath())
        );
    }
}

使用多個磁盤時,可以使用 Storage門面上的 disk方法訪問特定磁盤。當(dāng)然,可以繼續(xù)使用方法鏈執(zhí)行該磁盤上的方法:

$disk = Storage::disk('s3');
$contents = Storage::disk('local')->get('file.jpg')

3.2 獲取文件

get 方法用于獲取給定文件的內(nèi)容,該方法將會返回該文件的原生字符串內(nèi)容:

$contents = Storage::get('file.jpg');

exists 方法用于判斷給定文件是否存在于磁盤上:

$exists = Storage::disk('s3')->exists('file.jpg');

3.2.1 文件元信息

size 方法以字節(jié)方式返回文件大?。?/p>

$size = Storage::size('file1.jpg');

lastModified 方法以 UNIX時間戳格式返回文件最后一次修改時間:

$time = Storage::lastModified('file1.jpg');

3.3 存儲文件

put 方法用于存儲文件到磁盤??梢詡鬟f一個 PHP資源到 put方法,該方法將會使用 Flysystem 底層的流支持。在處理大文件的時候推薦使用文件流:

Storage::put('file.jpg', $contents);
Storage::put('file.jpg', $resource);

copy 方法將磁盤中已存在的文件從一個地方拷貝到另一個地方:

Storage::copy('old/file1.jpg', 'new/file1.jpg');

move 方法將磁盤中已存在的文件從一定地方移到到另一個地方:

Storage::move('old/file1.jpg', 'new/file1.jpg');

3.3.1 添加內(nèi)容到文件開頭/結(jié)尾

prependappend 方法允許你輕松插入內(nèi)容到文件開頭/結(jié)尾:

Storage::prepend('file.log', 'Prepended Text');
Storage::append('file.log', 'Appended Text');

3.4 刪除文件

delete 方法接收單個文件名或多個文件數(shù)組并將其從磁盤移除:

Storage::delete('file.jpg');
Storage::delete(['file1.jpg', 'file2.jpg']);

3.5 目錄

3.5.1 獲取一個目錄下的所有文件

files 方法返回給定目錄下的所有文件數(shù)組,如果你想要獲取給定目錄下包含子目錄的所有文件列表,可以使用 allFiles方法:

$files = Storage::files($directory);
$files = Storage::allFiles($directory);

3.5.2 獲取一個目錄下的所有子目錄

directories方法返回給定目錄下所有目錄數(shù)組,此外,可以使用 allDirectories方法獲取嵌套的所有子目錄數(shù)組:

$directories = Storage::directories($directory);
// 遞歸...
$directories = Storage::allDirectories($directory);

3.5.3 創(chuàng)建目錄

makeDirectory 方法將會創(chuàng)建給定目錄,包含子目錄(遞歸):

Storage::makeDirectory($directory);

3.5.4 刪除目錄

最后,deleteDirectory方法用于移除目錄,包括該目錄下的所有文件:

Storage::deleteDirectory($directory);

4、自定義文件系統(tǒng)

LaravelFlysystem集成支持自定義驅(qū)動,為了設(shè)置自定義的文件系統(tǒng)你需要創(chuàng)建一個服務(wù)提供者如 DropboxServiceProvider。在該提供者的 boot方法中,你可以使用 Storage門面的 extend方法定義自定義驅(qū)動:

<?php

namespace App\Providers;

use Storage;
use League\Flysystem\Filesystem;
use Dropbox\Client as DropboxClient;
use Illuminate\Support\ServiceProvider;
use League\Flysystem\Dropbox\DropboxAdapter;

class DropboxServiceProvider extends ServiceProvider{
    /**
     * Perform post-registration booting of services.
     *
     * @return void
     */
    public function boot()
    {
        Storage::extend('dropbox', function($app, $config) {
            $client = new DropboxClient(
                $config['accessToken'], $config['clientIdentifier']
            );

            return new Filesystem(new DropboxAdapter($client));
        });
    }

    /**
     * Register bindings in the container.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

extend方法的第一個參數(shù)是驅(qū)動名稱,第二個參數(shù)是獲取$app$config 變量的閉包。該解析器閉包必須返回一個 League\Flysystem\Filesystem實例。$config變量包含了定義在配置文件 config/filesystems.php中為特定磁盤定義的選項。

創(chuàng)建好注冊擴(kuò)展的服務(wù)提供者后,就可以使用配置文件 config/filesystem.php中的 dropbox驅(qū)動了。