php 5.6 文档,文件存储 | 进阶系列 | Laravel 5.6 中文文档
文件存儲
由 學院君 創建于3年前, 最后更新于 1年前
版本號 #2
31608 views
3 likes
0 collects
簡介
Laravel 基于 Frank de Jonge 開發的 PHP 包 Flysystem 提供了強大的文件系統抽象層。Laravel 集成 Flysystem 以便使用不同驅動簡化對文件系統的操作,這些驅動包括本地文件系統、Amazon S3 以及 Rackspace 云存儲。此外,在這些存儲選項之間切換非常簡單,因為對不同系統而言,API 是一致的。
配置
文件系統配置文件位于 config/filesystems.php。在該文件中可以配置所有“磁盤”,每個磁盤描述了特定的存儲驅動和存儲路徑。該配置文件為每種支持的驅動提供了示例配置,所以,簡單編輯該配置來應用你的存儲參數和認證信息即可:
當然,你想配置多少磁盤就配置多少,多個磁盤也可以共用同一個驅動。
公共磁盤
public 磁盤用于存儲可以被公開訪問的文件,默認情況下, public 磁盤使用 local 驅動并將文件存儲在 storage/app/public 目錄下,要讓這些文件可以通過 Web 瀏覽器訪問到,還需要創建一個軟鏈 public/storage 指向 storage/app/public ,這種方式可以將公開訪問的文件保存在一個可以很容易被不同部署環境共享的目錄,在使用零停機時間部署系統如Envoyer 的時候尤其方便。
要創建這個軟鏈,可以使用 Artisan 命令 storage:link :
php artisan storage:link
文件被存儲并且軟鏈已經被創建的情況下,就可以使用輔助函數 asset 創建一個指向該文件的 URL:
echo asset('storage/file.txt');
本地驅動
使用 local 驅動的時候,所有的文件操作都相對于定義在配置文件中的 root 目錄,默認情況下,該值設置為 storage/app 目錄,因此,下面的方法將會存儲文件到 storage/app/file.txt:
Storage::disk('local')->put('file.txt', 'Contents');
驅動預備知識
Composer包
在使用 SFTP、Amazon S3 或 Rackspace 驅動之前,需要通過Composer 安裝相應的包:
SFTP:league/flysystem-sftp ~1.0
Amazon S3: league/flysystem-aws-s3-v3 ~1.0
Rackspace: league/flysystem-rackspace ~1.0S3 驅動配置
S3 驅動配置信息位于配置文件 config/filesystems.php ,該文件包含 S3 驅動的示例配置數組。你可以使用自己的 S3 配置和認證信息編輯該數組。為了方便起見,這些環境變量和 AWS CLI 的命名規范一致。
FTP 驅動配置
Laravel 的 Flysystem 集成支持 FTP 操作,不過,框架默認的配置文件 filesystems.php 并沒有提供示例配置。如果你需要配置一個FTP文件系統,可以使用以下示例配置:
'ftp' => [
'driver' => 'ftp',
'host' => 'ftp.example.com',
'username' => 'your-username',
'password' => 'your-password',
// Optional FTP Settings...
// 'port' => 21,
// 'root' => '',
// 'passive' => true,
// 'ssl' => true,
// 'timeout' => 30,
],
SFTP 驅動配置
Laravel 的 Flysystem 集成支持 SFTP 操作,不過,框架默認的 filesystems.php 配置文件并沒有為此提供一個示例配置。如果你需要配置針對 SFTP 的文件系統配置,可以使用下面的示例配置:
'sftp' => [
'driver' => 'sftp',
'host' => 'example.com',
'username' => 'your-username',
'password' => 'your-password',
// Settings for SSH key based authentication...
// 'privateKey' => '/path/to/privateKey',
// 'password' => 'encryption-password',
// Optional SFTP Settings...
// 'port' => 22,
// 'root' => '',
// 'timeout' => 30,
],
Rackspace 驅動配置
Laravel 的 Flysystem 集成還支持 Rackspace 操作,同樣,默認配置文件 filesystems.php 也沒有提供對應的示例配置,如果你需要配置 Rackspace 文件系統,可以使用以下示例配置:
'rackspace' => [
'driver' => 'rackspace',
'username' => 'your-username',
'key' => 'your-key',
'container' => 'your-container',
'endpoint' => 'https://identity.api.rackspacecloud.com/v2.0/',
'region' => 'IAD',
'url_type' => 'publicURL',
],
獲取硬盤實例
我們可以使用 Storage 門面和上面配置的任意磁盤進行交互,例如,可以使用該門面上的 put 方法來存儲頭像到默認磁盤,如果調用 Storage 門面上的方法而沒有調用 disk 方法,則調用的方法會自動被傳遞到默認磁盤:
use Illuminate\Support\Facades\Storage;
Storage::put('avatars/1', $fileContents);
與多個磁盤進行交互時,可以使用 Storage 門面上的 disk 方法訪問特定磁盤:
Storage::disk('s3')->put('avatars/1', $fileContents);
獲取文件
get 方法用于獲取給定文件的內容,該方法將會返回該文件的原生字符串內容。需要注意的是,所有文件路徑都是相對于配置文件中指定的磁盤默認根目錄:
$contents = Storage::get('file.jpg');
exists 方法用于判斷給定文件是否存在于磁盤上:
$exists = Storage::disk('s3')->exists('file.jpg');
下載文件
download 方法可用于生成強制用戶瀏覽器下載給定路徑文件的響應。download 方法接收一個文件名作為第二個參數用于決定用戶下載時看到的文件名。最后,你可以傳遞一個 HTTP 請求頭數組作為該方法的第三個參數:
return Storage::download('file.jpg');
return Storage::download('file.jpg', $name, $headers);
文件 URL
使用 local 或 s3 驅動時,可以使用 url 方法獲取給定文件的 URI。如果你使用的是 local 驅動,通常會在給定路徑前加上 /storage,并返回該文件的相對 URL;如果使用的是 s3 或 rackspace 驅動,則會返回完整的遠程 URL:
use Illuminate\Support\Facades\Storage;
$url = Storage::url('file1.jpg');
注:記住,如果你在使用 local 驅動,所有需要公開訪問的文件都應該存放在 storage/app/public 目錄下,此外,你還需要創建一個指向 storage/app/public 目錄的軟鏈接 public/storage。
臨時 URL
對于使用 s3 或 rackspace 驅動存儲文件的系統,可以使用 temporaryUrl 方法創建臨時 URL 到給定文件,該方法接收一個路徑參數和指定 URL 何時過期的 DateTime 實例:
$url = Storage::temporaryUrl(
'file1.jpg', now()->addMinutes(5)
);
自定義本地主機URL
如果你想要預定義使用 local 驅動磁盤存放文件的主機,可以添加 url 選項到磁盤配置數組:
'public' => [
'driver' => 'local',
'root' => storage_path('app/public'),
'url' => env('APP_URL').'/storage',
'visibility' => 'public',
],
文件元信息
除了讀寫文件之外,Laravel 還可以提供文件本身的信息。例如,size 方法可用于以字節方式返回文件大小:
use Illuminate\Support\Facades\Storage;
$size = Storage::size('file1.jpg');
lastModified 方法以 UNIX 時間戳
格式返回文件最后一次修改時間:
$time = Storage::lastModified('file1.jpg');
存儲文件
put 方法可用于存儲原生文件內容到磁盤。此外,還可以傳遞一個 PHP 資源到 put 方法,該方法將會使用 Flysystem 底層的流支持。在處理大文件的時候推薦使用文件流:
use Illuminate\Support\Facades\Storage;
Storage::put('file.jpg', $contents);
Storage::put('file.jpg', $resource);
自動文件流
如果你想要 Laravel 自動將給定文件流輸出到對應存儲路徑,可以使用 putFile 或 putFileAs 方法,該方法接收 Illuminate\Http\File 或 Illuminate\Http\UploadedFile 實例,然后自動將文件流保存到期望的路徑:
use Illuminate\Http\File;
use Illuminate\Support\Facades\Storage;
// 自動計算文件名的MD5值...
Storage::putFile('photos', new File('/path/to/photo'));
// 手動指定文件名...
Storage::putFileAs('photos', new File('/path/to/photo'), 'photo.jpg');
這里有一些關于 putFile 方法的重要注意點,注意到我們只指定了目錄名,默認情況下,putFile 方法會基于文件內容自動生成文件名。實現原理是對文件內容進行 MD5 哈希運算。putFile 方法會返回文件路徑,包括文件名,以便于在數據庫中進行存儲。
putFile 和 putFileAs 方法還接收一個用于指定存儲文件“可見度”的參數,這在你將文件存儲到云存儲(如S3)平臺并期望文件可以被公開訪問時很有用:
Storage::putFile('photos', new File('/path/to/photo'), 'public');
添加內容到文件開頭/結尾
prepend 和 append 方法允許你輕松插入內容到文件開頭/結尾:
Storage::prepend('file.log', 'Prepended Text');
Storage::append('file.log', 'Appended Text');
拷貝 & 移動文件
copy 方法將磁盤中已存在的文件從一個地方拷貝到另一個地方,而 move 方法將磁盤中已存在的文件從一定地方移到到另一個地方:
Storage::copy('old/file1.jpg', 'new/file1.jpg');
Storage::move('old/file1.jpg', 'new/file1.jpg');
文件上傳
在 Web 應用中,最常見的存儲文件案例就是存儲用戶上傳的文件,如用戶頭像、照片和文檔等。Laravel 通過上傳文件實例上提供的 store 方法讓存儲上傳文件變得簡單。你只需要傳入上傳文件保存的路徑并調用 store 方法即可:
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class UserAvatarController extends Controller
{
/**
* 更新用戶頭像.
*
* @param Request $request
* @return Response
* @translator laravelacademy.org
*/
public function update(Request $request)
{
$path = $request->file('avatar')->store('avatars');
return $path;
}
}
這里有一些需要注意的重要事項,在這里我們只指定了目錄名,而不是文件名。默認情況下,store 方法會基于文件內容自動生成文件名,這通過對文件內容進行 MD5 實現。store 方法會返回文件路徑以便在數據庫中保存文件路徑和文件名。
你還可以調用 Storage 門面上的 putFile 方法來執行與上例同樣的文件操作:
$path = Storage::putFile('avatars', $request->file('avatar'));
指定文件名
如果你不想要自動生成文件名,可以使用 storeAs 方法,該方法接收路徑、文件名以及磁盤(可選)作為參數:
$path = $request->file('avatar')->storeAs(
'avatars', $request->user()->id
);
當然,你還可以使用 Storage 門面上的 putFileAs 方法,該方法與上面的方法實現同樣的操作:
$path = Storage::putFileAs(
'avatars', $request->file('avatar'), $request->user()->id
);
指定磁盤
默認情況下,store 方法會使用默認的磁盤,如果你想要指定其它磁盤,傳遞磁盤名稱作為 store 方法的第二個參數即可:
$path = $request->file('avatar')->store(
'avatars/'.$request->user()->id, 's3'
);
文件可見度
在 Laravel 的 Flysystem 集成中,“可見度”是對不同平臺上文件權限的抽象,文件可以被聲明成 public 或 private,當文件被聲明為 public,意味著文件可以被其他人訪問。例如,使用S3時,可以獲取 public 文件的 URL。
使用 put 方法設置文件的時候可以順便設置可見度:
use Illuminate\Support\Facades\Storage;
Storage::put('file.jpg', $contents, 'public');
如果文件已經被存儲,可見度可以通過 getVisibility 和 setVisibility 方法獲取和設置:
$visibility = Storage::getVisibility('file.jpg');
Storage::setVisibility('file.jpg', 'public');
刪除文件
delete 方法接收單個文件名或多個文件數組并將其從磁盤移除:
use Illuminate\Support\Facades\Storage;
Storage::delete('file.jpg');
Storage::delete(['file1.jpg', 'file2.jpg']);
如果需要的話你可以指定從哪個磁盤刪除文件:
use Illuminate\Support\Facades\Storage;
Storage::disk('s3')->delete('folder_path/file_name.jpg');
目錄
獲取一個目錄下的所有文件
files 方法返回給定目錄下的所有文件數組,如果你想要獲取給定目錄下包含子目錄的所有文件列表,可以使用 allFiles 方法:
use Illuminate\Support\Facades\Storage;
$files = Storage::files($directory);
$files = Storage::allFiles($directory);
獲取一個目錄下的所有子目錄
directories 方法返回給定目錄下所有目錄數組,此外,可以使用allDirectories 方法獲取嵌套的所有子目錄數組:
$directories = Storage::directories($directory);
// 遞歸...
$directories = Storage::allDirectories($directory);
創建目錄
makeDirectory 方法將會創建給定目錄,包含子目錄(遞歸):
Storage::makeDirectory($directory);
刪除目錄
最后,deleteDirectory 方法用于移除目錄,包括該目錄下的所有文件:
Storage::deleteDirectory($directory);
自定義文件系統
Laravel 的 Flysystem 集成開箱提供了多個“驅動”,不過,Flysystem 的功能并不止步于此,還為許多其他存儲系統提供了適配器。通過使用這些額外的適配器你可以在自己的 Laravel 應用創建自定義的驅動。
為了設置自定義的文件系統,你需要一個 Flysystem 適配器,我們來添加一個社區維護的 Dropbox 適配器到項目中:
composer require spatie/flysystem-dropbox
接下來,需要創建一個服務提供者如 DropboxServiceProvider。在該提供者的 boot 方法中,你可以使用 Storage 門面的 extend 方法定義自定義驅動:
namespace App\Providers;
use Storage;
use League\Flysystem\Filesystem;
use Illuminate\Support\ServiceProvider;
use Spatie\Dropbox\Client as DropboxClient;
use Spatie\FlysystemDropbox\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['authorizationToken']
);
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 驅動了。
總結
以上是生活随笔為你收集整理的php 5.6 文档,文件存储 | 进阶系列 | Laravel 5.6 中文文档的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: java控制excel_java操作ex
- 下一篇: 苹果电脑更改sd卡只读_SD卡变为只读系
