在 Laravel 中,要訪問上傳到本地的檔案資源,需要先建立一個軟連線。使用 storage:link
Artisan 命令,就可以快速建立這個軟連結。
# php artisan storage:link
命令執行完畢後,就會在專案裡多出一個 public/storage
,這個 storage
就是一個軟連結,它指向 storage/app/public
目錄。
public/storage(軟連線) → storage/app/public
目錄樹結構是這樣的。
public/
├── storage(軟連線,指向目錄 `storage/app/public`)
├── css/
│ └── bootstrap.css
└── js/
└── bootstrap.js
storage/
└── app/
└── public/
└── user-avatar.png
一、為何要建立軟連結?
專案根目錄下的 public
是一個特殊的目錄——存放可公共訪問的資源。就像你看到的,除了 storage
這個軟連結,還有 CSS 和 JS 檔案都放在這裡。如果你的域名是 my.app
,那麼訪問這些資源的 URL 如下:
細心的你會發現,http://my.app/storage/user-avatar.png
實際訪問的檔案資源的伺服器地址是 /path/to/myapp/storage/app/public/user-avatar.png
。
如果上傳的資原始檔是儲存在本地的,Laravel 預設會放在 storage/app
裡面,這個目錄是不可見的,如果想要能公共訪問就必須暴露在專案根目錄下的 public
中,這就是建立軟連結的原因 。
二、Laravel 的選擇
Laravel 預設建立軟連結的方式已經提過。
public/storage → storage/app/public
storage/app/public
的意思很好理解,就是儲存在伺服器上,但是暴露給公共(public)使用的資源目錄。那麼 public/storage
呢,為什麼要這樣命名?下面是我的思考,假如不這麼命名,我們能用什麼命名方式?
2.1 第一種命名
public/public → storage/app/public
這樣的好處是軟連結 public
和被指向的目錄名一樣了,方便記憶。但是訪問資源的路徑變成:
有一個問題是,你能說 JS 和 CSS 不是 public 的嗎?所以這個 pass 掉。
2.2 第二種命名
public/uploads → storage/app/public
此時,訪問資源的路徑變成。
這容易有誤解——上傳的檔案資源都可以使用 http://my.app/uploads/
的形式訪問到。
2.3 Laravel 的選擇
雖然
public/storage → storage/app/public
的選擇不如第一種命名方式方便記憶,但還是保持了某種程度上的語義且不容易誤解——
使用者訪問的是伺服器上 儲存 的資原始檔,而且這個資原始檔是可以公共訪問的。
本作品採用《CC 協議》,轉載必須註明作者和本文連結