除了密碼儲存之外,有時候我們也會需要儲存一些實體檔案。
今天我們來聊聊怎麼利用 Laravel 來儲存檔案。
要用程式建立檔案,我們可以利用內建的 Storage
類別
Storage::disk('local')->put('example.txt', 'Contents');
預設狀況下,程式產生的檔案都會放在 storage/app
資料夾下。這個資料夾底下的檔案是不會透過網路對外公開的。
如果希望產生的檔案對外公開的話,一般來說會將檔案放在 public
資料夾內。不過這樣的話,在建立檔案的階段,又要做一些特殊的設定,說實話有一些麻煩。
更簡單的做法,是做一個連接,將 public/storage
這個路徑連接到 storage/app/public
內,這樣我們就可以將檔案放在 storage/app/public
內,但是檔案也對外公開了。
要產生這個連接,相信各位讀者又猜到了,還是透過 artisan
./vendor/bin/sail artisan storage:link
這樣,我們就可以安心的生成檔案,並且網站的使用者也能簡單的存取這些內容了。
如果想要寫入圖片或影片之類的檔案,可以直接傳入 PHP 的 resource
Storage::put('file.jpg', $resource);
如果你希望不要儲存檔案到本地電腦內,而是傳到網路儲存的服務,比方說 AWS 的 S3 上,在 Laravel 要這麼做也很簡單
首先,我們先安裝對應的套件
./vendor/bin/sail composer require league/flysystem-aws-s3-v3 "^3.0"
接著,就可以透過 Storage 存取了
Storage::disk('s3')->put('example.txt', 'Contents');
S3 的設定已經預設寫在 config/filesystem.php
內,我們只需要在 .env
裡面加上對應的設置參數即可
's3' => [
'driver' => 's3',
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'region' => env('AWS_DEFAULT_REGION'),
'bucket' => env('AWS_BUCKET'),
'url' => env('AWS_URL'),
'endpoint' => env('AWS_ENDPOINT'),
'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false),
'throw' => false,
],
.env
預設參數如下
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=
AWS_USE_PATH_STYLE_ENDPOINT=false
要讀取檔案也很直觀
$contents = Storage::get('file.jpg');
如果希望取得一些基礎的檔案資訊,也非常簡單
比方說,size()
可以取得檔案的大小
Storage::size('file.jpg');
lastModified()
可以取得檔案最後修改的時間
$time = Storage::lastModified('file.jpg');
用 Laravel 來處理檔案,是不是很直觀又很簡單呢?
有關檔案處理的部分,今天就先分享到這邊。我們明天見!