服務(wù) ―― 文件系統(tǒng)/云存儲(chǔ)

2018-02-24 15:38 更新

服務(wù) —— 文件系統(tǒng)/云存儲(chǔ)

1、簡(jiǎn)介

基于Frank de Jonge的PHP包Flysystem,Laravel提供了強(qiáng)大的文件系統(tǒng)選項(xiàng)間切換非常簡(jiǎn)單,因?yàn)閷?duì)每個(gè)系統(tǒng)而言,API是一樣的。

2、配置

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

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

2.1 本地驅(qū)動(dòng)

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

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

2.2 其它驅(qū)動(dòng)預(yù)備知識(shí)

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

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

3、基本使用

3.1 獲取硬盤實(shí)例

Storage門面用于和你配置的所有磁盤進(jìn)行交互,例如,你可以使用該門面上的put方法來(lái)存儲(chǔ)頭像到默認(rèn)磁盤,如果你調(diào)用Storage門面上的方法卻先調(diào)用disk方法,該方法調(diào)用自動(dòng)傳遞到默認(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())
        );
    }
}

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

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

3.2 獲取文件

get方法用于獲取給定文件的內(nèi)容,該方法將會(huì)返回該文件的原生字符串內(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時(shí)間戳格式返回文件最后一次修改時(shí)間:

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

3.3 存儲(chǔ)文件

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

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

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

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

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

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?方法接收單個(gè)文件名或多個(gè)文件數(shù)組并將其從磁盤移除:

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

3.5 目錄

3.5.1?獲取一個(gè)目錄下的所有文件

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

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

3.5.2 獲取一個(gè)目錄下的所有子目錄

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

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

3.5.3?創(chuàng)建目錄

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

Storage::makeDirectory($directory);

3.5.4 刪除目錄

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

Storage::deleteDirectory($directory);

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

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

<?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方法的第一個(gè)參數(shù)是驅(qū)動(dòng)名稱,第二個(gè)參數(shù)是獲取$app$config變量的閉包。該解析器閉包必須返回一個(gè)League\Flysystem\Filesystem實(shí)例。$config變量包含了定義在配置文件config/filesystems.php中為特定磁盤定義的選項(xiàng)。

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

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)