1. 程式人生 > >Laravel -- 檔案管理及上傳自定義目錄及檔名

Laravel -- 檔案管理及上傳自定義目錄及檔名

開發之路,羊腸九曲,荊棘密佈,幸得高人指點,前輩填坑,一路謹小慎微,終得工程圓滿;其間填坑之經驗,開路之歷程,皆為精華,不可棄之;記錄於此,以便事後回顧,亦想於有相關開發疑惑之同學做參考之用,文中如若有錯,懇請雅正,不勝感激。

Laravel檔案系統

Laravel框架中對檔案的管理已經很友好了,官方文件也做了很詳細的說明,下面先就一些基礎知識做下簡單介紹,已瞭解的同學可以略過本部分。

系統配置

Laravel 有強大的檔案系統抽象,基於Frank de Jonge 開發的PHP包,檔案系統的配置檔案位於 config/filesystems.php

公共磁碟

public 磁碟用於儲存可以被公開訪問的檔案,預設情況下, public 磁碟使用 local 驅動並將檔案儲存在 storage/app/public ,要讓這些檔案可以通過web訪問到,需要建立一個軟鏈 public/storage 指向 storage/app/public ,這種方式可以將公開訪問的檔案儲存在一個可以很容易被不同部署環境共享的目錄,在使用零停機時間部署系統如Envoyer的時候尤其方便。

獲取檔案

get 方法用於獲取指定檔案
__exists__方法用於判斷給定檔案是否存在於磁碟上:

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

檔案上傳

在web應用中,最常見的儲存檔案案例就是儲存使用者上傳的檔案,如使用者頭像、照片和文件等。Laravel通過使用上傳檔案例項上的store方法讓儲存上傳檔案變得簡單。你只需要傳入上傳檔案儲存的路徑並呼叫store方法即可:

$path = $request->file('avatar')->store('avatars');

指定檔名

$path = $request->file('avatar')->storeAs(
    'avatars', $request->user()->id
);

檔案刪除

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

自定義檔案上傳

使用Laravel檔案上傳很方便,在開發中我們需要建立軟連線,但是有可能具體專案中不需要建立軟連線,或者需要直接在公共盤 public 下面就能直接訪問檔案,這個時候就需要調整一下配置檔案。

預設的驅動是__local__ 驅動 (config/filesystems.php):

'disks' => [

    'local' => [
        'driver' => 'local',
        'root' => storage_path('app'),
    ],

    'public' => [
        'driver' => 'local',
        'root' => storage_path('app/public'),
        'visibility' => 'public',
    ],

    's3' => [
        'driver' => 's3',
        'key' => 'your-key',
        'secret' => 'your-secret',
        'region' => 'your-region',
        'bucket' => 'your-bucket',
    ],

],

我們增加一條驅動資訊:

	'root' => [
        'driver' => 'local',
        'root' => base_path(''),
    ],
    'local' => [
        'driver' => 'local',
        'root' => public_path(''),
    ],

這樣該驅動指向專案根目錄,然後我們在上傳處理函式中:

$path = $request->file('avatar')->store(
    'public/avatars/test.png', 'root'
);

判斷檔案是否存在或者刪除檔案時:

Storage::disk('root')->delete($imagePath);

base_path 就是專案根目錄
app_path 就是專案下App資料夾
storage_path 就是專案下的storage資料夾