基于 Frank de Jonge
的 PHP
包 Flysystem,Laravel
提供了強(qiáng)大的文件系統(tǒng)抽象。Laravel
文件系統(tǒng)集成提供了使用驅(qū)動處理本地文件系統(tǒng)的簡單使用,這些驅(qū)動包括 Amazon S3
,以及 Rackspace
云存儲。更好的是在這些存儲選項間切換非常簡單,因為對每個系統(tǒng)而言,API 是一樣的。
文件系統(tǒng)配置文件位于 config/filesystems.php
。在該文件中可以配置所有”硬盤“,每個硬盤描述了特定的存儲驅(qū)動和存儲位置。為每種支持的驅(qū)動的示例配置包含在該配置文件中,所以,簡單編輯該配置來反映你的存儲參數(shù)和認(rèn)證信息。
當(dāng)然,你想配置磁盤多少就配置多少,多個磁盤也可以共用同一個驅(qū)動。
使用 local
驅(qū)動的時候,注意所有文件操作相對于定義在配置文件中的 root
目錄,默認(rèn)情況下,該值設(shè)置為 storage/app
目錄,因此,下面的方法將會存儲文件到 storage/app/file.txt
:
Storage::disk('local')->put('file.txt', 'Contents');
在使用 Amazon S3
或 Rackspace
驅(qū)動之前,需要通過 Composer
安裝相應(yīng)的包:
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')
get 方法用于獲取給定文件的內(nèi)容,該方法將會返回該文件的原生字符串內(nèi)容:
$contents = Storage::get('file.jpg');
exists
方法用于判斷給定文件是否存在于磁盤上:
$exists = Storage::disk('s3')->exists('file.jpg');
size 方法以字節(jié)方式返回文件大?。?/p>
$size = Storage::size('file1.jpg');
lastModified
方法以 UNIX
時間戳格式返回文件最后一次修改時間:
$time = Storage::lastModified('file1.jpg');
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');
prepend
和 append
方法允許你輕松插入內(nèi)容到文件開頭/結(jié)尾:
Storage::prepend('file.log', 'Prepended Text');
Storage::append('file.log', 'Appended Text');
delete
方法接收單個文件名或多個文件數(shù)組并將其從磁盤移除:
Storage::delete('file.jpg');
Storage::delete(['file1.jpg', 'file2.jpg']);
files
方法返回給定目錄下的所有文件數(shù)組,如果你想要獲取給定目錄下包含子目錄的所有文件列表,可以使用 allFiles
方法:
$files = Storage::files($directory);
$files = Storage::allFiles($directory);
directories
方法返回給定目錄下所有目錄數(shù)組,此外,可以使用 allDirectories
方法獲取嵌套的所有子目錄數(shù)組:
$directories = Storage::directories($directory);
// 遞歸...
$directories = Storage::allDirectories($directory);
makeDirectory
方法將會創(chuàng)建給定目錄,包含子目錄(遞歸):
Storage::makeDirectory($directory);
最后,deleteDirectory
方法用于移除目錄,包括該目錄下的所有文件:
Storage::deleteDirectory($directory);
Laravel
的 Flysystem
集成支持自定義驅(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ū)動了。