关于 `storage:link` Artisan 命令的一些思考

在 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 协议》,转载必须注明作者和本文链接
本帖由系统于 2年前 自动加精
zhangbao
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 9

今日读到这里,更深入的了解了软链接,特意注册账号留言,以表感谢.

2年前 评论
zhangbao

@耕夫 感谢鼓励?

2年前 评论

Laravel 的命令是使用的绝对路径来创建的,在5.1等没有此命令的时候我个人习惯使用相对路径来创建,移动目录、更改文件名时可以不用重新创建软连接,在 Docker、Homestead 等类虚拟机方式中使用时也不用可以进入vm,可以作为你的补充。

2年前 评论

不错。很好的巩固了一下软连接。谢了。

2年前 评论
zhangbao

@Ali ;)

2年前 评论

在lumen中怎么创建呢?

file

11个月前 评论

怎么访问到storage/app/uploads 呢

11个月前 评论
1184101042 (作者) 11个月前

解决了,感谢~ :+1:

10个月前 评论

使用 docker 部署的 laravel 应用 执行 php artisan storage:link 不管用呢,访问直接 404

6个月前 评论

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!