PHP框架在laravel5.4中接收uploadify插件上传的图片存储方式,使用laravel文件存储中把文件存储到laravel的storage目录下了
nginx.conf配置文件网站根目录指向了public, 那么public就是我的网站根目录,而storage是和public目录相同层级的,所以导致存储在里面的文件无法被访问。
//图片上传 public function upload(Request $request) { $path = $request->file('Filedata')->store('public'); //把路径/拆分 获取图片名称 $pathArr = explode('/', $path); return $pathArr[1];//路径中多了一个public }
PHP框架 laravel官方给了一个说法:
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’);
但是具体如何做呢?
它的意思就是: 在PHP框架 Laravel 中,要访问上传到本地storage目录下的文件资源,需要先创建一个软连接。
使用 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
一、为何要创建软链接?#
PHP框架项目根目录下的 public 是一个特殊的目录——存放可公共访问的资源。就像你看到的,除了 storage 这个软链接,还有 CSS 和 JS 文件都放在这里。如果你的域名是 my.app,那么访问这些资源的 URL 如下:
http://my.app/storage/user-avatar.png
http://my.app/css/bootstrap.css
http://my.app/js/bootstrap.js
细心的你会发现,http://my.app/storage/user-avatar.png 实际访问的文件资源的服务器地址是 /path/to/myapp/storage/app/public/user-avatar.png。
如果上传的资源文件是存储在本地的,Laravel 默认会放在 storage/app 里面,这个目录是不可见的,如果想要能公共访问就必须暴露在项目根目录下的 public 中,这就是创建软链接的原因 。
二、PHP框架Laravel 的选择#
PHP框架Laravel 默认创建软链接的方式已经提过。
public/storage → storage/app/public
storage/app/public 的意思很好理解,就是存储在服务器上,但是暴露给公共(public)使用的资源目录。那么 public/storage 呢,为什么要这样命名?下面是我的思考,假如不这么命名,我们能用什么命名方式?
2.1 第一种命名#
public/public → storage/app/public
这样的好处是软链接 public 和被指向的目录名一样了,方便记忆。但是访问资源的路径变成:
http://my.app/public/user-avatar.png
http://my.app/css/bootstrap.css
http://my.app/js/bootstrap.js
有一个问题是,你能说 JS 和 CSS 不是 public 的吗?所以这个 pass 掉。
2.2 第二种命名#
public/uploads → storage/app/public
此时,访问资源的路径变成。
http://my.app/uploads/user-avatar.png
http://my.app/css/bootstrap.css
http://my.app/js/bootstrap.js
这容易有误解——上传的文件资源都可以使用 http://my.app/uploads/ 的形式访问到。
2.3 PHP框架Laravel 的选择#
虽然
public/storage → storage/app/public
的选择不如第一种命名方式方便记忆,但还是保持了某种程度上的语义且不容易误解——
http://my.app/storage/user-avatar.png
用户访问的是服务器上 存储 的资源文件,而且这个资源文件是可以公共访问的。