laravel-admin文件上传讲解

1. 查看文件上传配置

config/admin.php

.
.
.
'upload' => [
    // `config/filesystem.php`中设置的disk
    // Disk in `config/filesystem.php`.
    'disk' => 'public',

    // image和file类型表单元素的上传目录
    // Image and file upload path under the disk above.
    'directory' => [
        'image' => 'images',
        'file'  => 'files',
    ],
],
.
.
.

发现文件默认存储在 storage/app/public 目录下

2. laravel-admin 后台上传文件404

通过查看 chrome 控制台发现,默认访问图片路径为:

  1. 图片:http://xxx.com/storage/images/59e42831N83d658b3.jpg
  2. 文件:http://xxx.com/storage/files/59e42831N83d658b3.html

造成 404 是因为我们上传文件的都是存储在 storage 目录下,而 HTTP 服务器指向的根目录是 public 目录,要想用户能通过浏览器访问 storage 目录下的文件,需要创建一个软链接,Laravel 内置了这个命令:

$ php artisan storage:link

再刷新一下页面,可以看到图片展示正常:

3. 前台访问 laravel-admin 上传文件404

这是因为商品的 image 字段保存的是图片的相对于目录 storage/app/public/ 的路径,需要转成绝对路径才能正常展示,我们可以给商品模型加一个访问器来输出绝对路径:

app/Models/Users.php

use Illuminate\Support\Str;
.
.
.
    public function getImageUrlAttribute()
    {
        // 如果 image 字段本身就已经是完整的 url 就直接返回
        if (Str::startsWith($this->attributes['image'], ['http://', 'https://'])) {
            return $this->attributes['image'];
        }
        return \Storage::disk('public')->url($this->attributes['image']);
    }

这里 \Storage::disk('public') 的参数 public 需要和我们在 config/admin.php 里面的 upload.disk 配置一致。

然后修改模板文件,改为输出我们刚刚加上的访问器:

resources/views/index.blade.php

<div class="img"><img src="{{ $product->image_url }}" alt=""></div>

Laravel 的模型访问器会自动把下划线改为驼峰,所以 image_url 对应的就是 getImageUrlAttribute

再次刷新页面,会发现访问正常。

讨论数量: 0

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