# 服務 —— 文件系統/云存儲
## 1、簡介
基于Frank de Jonge的PHP包[Flysystem](https://github.com/thephpleague/flysystem),Laravel提供了強大的文件系統選項間切換非常簡單,因為對每個系統而言,API是一樣的。
## 2、配置
文件系統配置文件位于`config/filesystems.php`。在該文件中可以配置所有”硬盤“,每個硬盤描述了特定的存儲驅動和存儲位置。為每種支持的驅動的示例配置包含在該配置文件中,所以,簡單編輯該配置來反映你的存儲參數和認證信息。
當然,你想配置磁盤多少就配置多少,多個磁盤也可以共用同一個驅動。
### 2.1 本地驅動
使用`local`驅動的時候,注意所有文件操作相對于定義在配置文件中的`root`目錄,默認情況下,該值設置為`storage/app`目錄,因此,下面的方法將會存儲文件到`storage/app/file.txt`:
~~~
Storage::disk('local')->put('file.txt', 'Contents');
~~~
### 2.2 其它驅動預備知識
在使用Amazon S3或Rackspace驅動之前,需要通過Composer安裝相應的包:
* Amazon S3:?`league/flysystem-aws-s3-v3 ~1.0`
* Rackspace:?`league/flysystem-rackspace ~1.0`
## 3、基本使用
### 3.1 獲取硬盤實例
`Storage`[門面](http://laravelacademy.org/post/97.html)用于和你配置的所有磁盤進行交互,例如,你可以使用該門面上的put方法來存儲頭像到默認磁盤,如果你調用`Storage`門面上的方法卻先調用`disk`方法,該方法調用自動傳遞到默認磁盤:
~~~
<?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`方法訪問特定磁盤。當然,可以繼續使用方法鏈執行該磁盤上的方法:
~~~
$disk = Storage::disk('s3');
$contents = Storage::disk('local')->get('file.jpg')
~~~
### 3.2 獲取文件
`get`方法用于獲取給定文件的內容,該方法將會返回該文件的原生字符串內容:
~~~
$contents = Storage::get('file.jpg');
~~~
`exists`方法用于判斷給定文件是否存在于磁盤上:
~~~
$exists = Storage::disk('s3')->exists('file.jpg');
~~~
#### 3.2.1 文件元信息
`size`方法以字節方式返回文件大小:
~~~
$size = Storage::size('file1.jpg');
~~~
`lastModified`方法以UNIX時間戳格式返回文件最后一次修改時間:
~~~
$time = Storage::lastModified('file1.jpg');
~~~
### 3.3 存儲文件
`put`方法用于存儲文件到磁盤。可以傳遞一個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 添加內容到文件開頭/結尾
`prepend`和`append`方法允許你輕松插入內容到文件開頭/結尾:
~~~
Storage::prepend('file.log', 'Prepended Text');
Storage::append('file.log', 'Appended Text');
~~~
### 3.4?刪除文件
`delete`?方法接收單個文件名或多個文件數組并將其從磁盤移除:
~~~
Storage::delete('file.jpg');
Storage::delete(['file1.jpg', 'file2.jpg']);
~~~
### 3.5 目錄
### 3.5.1?獲取一個目錄下的所有文件
`files`方法返回給定目錄下的所有文件數組,如果你想要獲取給定目錄下包含子目錄的所有文件列表,可以使用`allFiles`方法:
~~~
$files = Storage::files($directory);
$files = Storage::allFiles($directory);
~~~
### 3.5.2 獲取一個目錄下的所有子目錄
`directories`方法返回給定目錄下所有目錄數組,此外,可以使用`allDirectories`方法獲取嵌套的所有子目錄數組:
~~~
$directories = Storage::directories($directory);
// 遞歸...
$directories = Storage::allDirectories($directory);
~~~
### 3.5.3?創建目錄
`makeDirectory`方法將會創建給定目錄,包含子目錄(遞歸):
~~~
Storage::makeDirectory($directory);
~~~
### 3.5.4 刪除目錄
最后,`deleteDirectory`方法用于移除目錄,包括該目錄下的所有文件:
~~~
Storage::deleteDirectory($directory);
~~~
## 4、自定義文件系統
Laravel的Flysystem集成支持自定義驅動,為了設置自定義的文件系統你需要創建一個[服務提供者](http://laravelacademy.org/post/91.html)如`DropboxServiceProvider`。在該提供者的`boot`方法中,你可以使用`Storage`門面的`extend`方法定義自定義驅動:
~~~
<?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`方法的第一個參數是驅動名稱,第二個參數是獲取`$app`和`$config`變量的閉包。該解析器閉包必須返回一個`League\Flysystem\Filesystem`實例。$config變量包含了定義在配置文件`config/filesystems.php`中為特定磁盤定義的選項。
創建好注冊擴展的服務提供者后,就可以使用配置文件`config/filesystem.php`中的`dropbox`驅動了。
- 前言
- 序言
- 序言 ―― 發行版本說明
- 序言 ―― 升級指南
- 序言 ―― 貢獻代碼
- 開始
- 開始 ―― 安裝及配置
- 開始 ―― Laravel Homestead
- 基礎
- 基礎 ―― HTTP路由
- 基礎 ―― HTTP 中間件
- 基礎 ―― HTTP 控制器
- 基礎 ―― HTTP 請求
- 基礎 ―― HTTP 響應
- 基礎 ―― 視圖
- 基礎 ―― Blade模板
- 架構
- 架構 ―― 一次請求的生命周期
- 架構 ―― 應用目錄結構
- 架構 ―― 服務提供者
- 架構 ―― 服務容器
- 架構 ―― 契約
- 架構 ―― 門面
- 數據庫
- 數據庫 ―― 起步
- 數據庫 ―― 查詢構建器
- 數據庫 ―― 遷移
- 數據庫 ―― 填充數據
- Eloquent ORM
- Eloquent ORM ―― 起步
- Eloquent ORM ―― 關聯關系
- Eloquent ORM ―― 集合
- Eloquent ORM ―― 調整器
- Eloquent ORM ―― 序列化
- 服務
- 服務 ―― 用戶認證
- 服務 ―― Artisan 控制臺
- 服務 ―― Laravel Cashier(交易)
- 服務 ―― 緩存
- 服務 ―― 集合
- 服務 ―― Laravel Elixir
- 服務 ―― 加密
- 服務 ―― 錯誤&日志
- 服務 ―― 事件
- 服務 ―― 文件系統/云存儲
- 服務 ―― 哈希
- 服務 ―― 幫助函數
- 服務 ―― 本地化
- 服務 ―― 郵件
- 服務 ―― 包開發
- 服務 ―― 分頁
- 服務 ―― 隊列
- 服務 ―― Redis
- 服務 ―― Session
- 服務 ―― Envoy 任務運行器(SSH任務)
- 服務 ―― 任務調度
- 服務 ―― 測試
- 服務 ―― 驗證