关于 Dcat Admin 中的上传图片

尝试了一下关于
关于 Dcat Admin 中的上传图片
然后一直显示上传错误
代码如下

关于 Dcat Admin 中的上传图片
官方文档也没有详细的说明upload后的url,我本地测试的url是
关于 Dcat Admin 中的上传图片
在点击upload后就出现了这个404了

就并不是很理解怎么上传以及图片回显的问题

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
laravel_peng
最佳答案
请求分析:
  1. 你的图片上传的请求路径是:http://127.0.0.1/admin/setting
    file
  2. 在加上你用的是 Dcat Admin 后台,以及你控制器的截图,大概得知你用的估计是 resources 资源路由。
$router->resource('setting', xxxxxController::class);
  1. 资源路由里面包含了7种路由,但是根据你用的是 POST 方法,可以知道你走的路由如下:

file

  1. 它走的是你控制器中的 store 方法,你控制器里面看不到是因为,你继承了 AdminController 这个控制器,它有 store 方法

     public function store()
     {
         return $this->form()->store();
     }
  2. 父类里面的 store() 方法很简单,它最终走的还是 $this->form() 你控制器里面的 form() 方法。

  3. form() 的方法内容大概如下:

protected function form()
    {
        // 这个 Form 类和重要,里面定义了很多咱们使用的组件,包括 image
        return Form::make(new Setting(), function (Form $form) {
            $form->display('id');
            $form->image('image_column')->required();

        });
    }
  1. 看一这个 Formmake() 方法,使用编辑器代码追踪功能,点击进入 make() 方法中, 找到 vendor/dcat/laravel-admin/src/Form.php 这个文件,里面有个 $availableFields 成员变量内容如下:
protected static $availableFields = [
        ...
        'image'               => Field\Image::class,
        ...
];
  1. 点击追踪,进入这个 Image 这个类文件, 里面有一个 prepareFile() 方法。
    protected function prepareFile(UploadedFile $file)
    {
        $this->callInterventionMethods($file->getRealPath(), $file->getMimeType());

        $this->uploadAndDeleteOriginalThumbnail($file);
    }
  1. 然后点击这个方法,看哪些地方使用了,可以追踪到,他在 vendor/dcat/laravel-admin/src/Form/Field/UploadField.php 这个文件中的 upload() 方法中使用了它,这个 upload() 方法就是你图片上传的方法,这个方法也返回上传图片成功和失败的内容。
    public function upload(UploadedFile $file)
    {
        $request = request();
        ... //中间省略一部分代码

        $this->prepareFile($file);    // 这个方法是Image类里面的方法

        if (! is_null($this->storagePermission)) {
            $result = $this->getStorage()->putFileAs($this->getDirectory(), $file, $this->name, $this->storagePermission);
        } else {
            $result = $this->getStorage()->putFileAs($this->getDirectory(), $file, $this->name);
        }

        if ($result) {
            $path = $this->getUploadPath();
            $url = $this->objectUrl($path);

            // 上传成功
            return $this->responseUploaded($this->saveFullUrl ? $url : $path, $url);
        }

        // 上传失败
        throw new UploadException(trans('admin.uploader.upload_failed'));
    }
  1. 然后在这些方法里面,打一些断点,看看到底哪里出问题了!

  2. 然后也根据日志文件,里面的报错信息可以让你快速定位问题位置,以及原因。

2年前 评论
mengdodo 2年前
laravel_peng (作者) 2年前
ta_ta (楼主) 2年前
ta_ta (楼主) 2年前
laravel_peng (作者) 2年前
laravel_peng (作者) 2年前
ta_ta (楼主) 2年前
laravel_peng (作者) 2年前
讨论数量: 10
laravel_peng
请求分析:
  1. 你的图片上传的请求路径是:http://127.0.0.1/admin/setting
    file
  2. 在加上你用的是 Dcat Admin 后台,以及你控制器的截图,大概得知你用的估计是 resources 资源路由。
$router->resource('setting', xxxxxController::class);
  1. 资源路由里面包含了7种路由,但是根据你用的是 POST 方法,可以知道你走的路由如下:

file

  1. 它走的是你控制器中的 store 方法,你控制器里面看不到是因为,你继承了 AdminController 这个控制器,它有 store 方法

     public function store()
     {
         return $this->form()->store();
     }
  2. 父类里面的 store() 方法很简单,它最终走的还是 $this->form() 你控制器里面的 form() 方法。

  3. form() 的方法内容大概如下:

protected function form()
    {
        // 这个 Form 类和重要,里面定义了很多咱们使用的组件,包括 image
        return Form::make(new Setting(), function (Form $form) {
            $form->display('id');
            $form->image('image_column')->required();

        });
    }
  1. 看一这个 Formmake() 方法,使用编辑器代码追踪功能,点击进入 make() 方法中, 找到 vendor/dcat/laravel-admin/src/Form.php 这个文件,里面有个 $availableFields 成员变量内容如下:
protected static $availableFields = [
        ...
        'image'               => Field\Image::class,
        ...
];
  1. 点击追踪,进入这个 Image 这个类文件, 里面有一个 prepareFile() 方法。
    protected function prepareFile(UploadedFile $file)
    {
        $this->callInterventionMethods($file->getRealPath(), $file->getMimeType());

        $this->uploadAndDeleteOriginalThumbnail($file);
    }
  1. 然后点击这个方法,看哪些地方使用了,可以追踪到,他在 vendor/dcat/laravel-admin/src/Form/Field/UploadField.php 这个文件中的 upload() 方法中使用了它,这个 upload() 方法就是你图片上传的方法,这个方法也返回上传图片成功和失败的内容。
    public function upload(UploadedFile $file)
    {
        $request = request();
        ... //中间省略一部分代码

        $this->prepareFile($file);    // 这个方法是Image类里面的方法

        if (! is_null($this->storagePermission)) {
            $result = $this->getStorage()->putFileAs($this->getDirectory(), $file, $this->name, $this->storagePermission);
        } else {
            $result = $this->getStorage()->putFileAs($this->getDirectory(), $file, $this->name);
        }

        if ($result) {
            $path = $this->getUploadPath();
            $url = $this->objectUrl($path);

            // 上传成功
            return $this->responseUploaded($this->saveFullUrl ? $url : $path, $url);
        }

        // 上传失败
        throw new UploadException(trans('admin.uploader.upload_failed'));
    }
  1. 然后在这些方法里面,打一些断点,看看到底哪里出问题了!

  2. 然后也根据日志文件,里面的报错信息可以让你快速定位问题位置,以及原因。

2年前 评论
mengdodo 2年前
laravel_peng (作者) 2年前
ta_ta (楼主) 2年前
ta_ta (楼主) 2年前
laravel_peng (作者) 2年前
laravel_peng (作者) 2年前
ta_ta (楼主) 2年前
laravel_peng (作者) 2年前
laravel_peng
请求分析:
  1. 你的图片上传的请求路径是:http://127.0.0.1/admin/setting
    file
  2. 在加上你用的是 Dcat Admin 后台,以及你控制器的截图,大概得知你用的估计是 resources 资源路由。
$router->resource('setting', xxxxxController::class);
  1. 资源路由里面包含了7种路由,但是根据你用的是 POST 方法,可以知道你走的路由如下:

file

  1. 它走的是你控制器中的 store 方法,你控制器里面看不到是因为,你继承了 AdminController 这个控制器,它有 store 方法

     public function store()
     {
         return $this->form()->store();
     }
  2. 父类里面的 store() 方法很简单,它最终走的还是 $this->form() 你控制器里面的 form() 方法。

  3. form() 的方法内容大概如下:

protected function form()
    {
        // 这个 Form 类和重要,里面定义了很多咱们使用的组件,包括 image
        return Form::make(new Setting(), function (Form $form) {
            $form->display('id');
            $form->image('image_column')->required();

        });
    }
  1. 看一这个 Formmake() 方法,使用编辑器代码追踪功能,点击进入 make() 方法中, 找到 vendor/dcat/laravel-admin/src/Form.php 这个文件,里面有个 $availableFields 成员变量内容如下:
protected static $availableFields = [
        ...
        'image'               => Field\Image::class,
        ...
];
  1. 点击追踪,进入这个 Image 这个类文件, 里面有一个 prepareFile() 方法。
    protected function prepareFile(UploadedFile $file)
    {
        $this->callInterventionMethods($file->getRealPath(), $file->getMimeType());

        $this->uploadAndDeleteOriginalThumbnail($file);
    }
  1. 然后点击这个方法,看哪些地方使用了,可以追踪到,他在 vendor/dcat/laravel-admin/src/Form/Field/UploadField.php 这个文件中的 upload() 方法中使用了它,这个 upload() 方法就是你图片上传的方法,这个方法也返回上传图片成功和失败的内容。
    public function upload(UploadedFile $file)
    {
        $request = request();
        ... //中间省略一部分代码

        $this->prepareFile($file);    // 这个方法是Image类里面的方法

        if (! is_null($this->storagePermission)) {
            $result = $this->getStorage()->putFileAs($this->getDirectory(), $file, $this->name, $this->storagePermission);
        } else {
            $result = $this->getStorage()->putFileAs($this->getDirectory(), $file, $this->name);
        }

        if ($result) {
            $path = $this->getUploadPath();
            $url = $this->objectUrl($path);

            // 上传成功
            return $this->responseUploaded($this->saveFullUrl ? $url : $path, $url);
        }

        // 上传失败
        throw new UploadException(trans('admin.uploader.upload_failed'));
    }
  1. 然后在这些方法里面,打一些断点,看看到底哪里出问题了!

  2. 然后也根据日志文件,里面的报错信息可以让你快速定位问题位置,以及原因。

2年前 评论
mengdodo 2年前
laravel_peng (作者) 2年前
ta_ta (楼主) 2年前
ta_ta (楼主) 2年前
laravel_peng (作者) 2年前
laravel_peng (作者) 2年前
ta_ta (楼主) 2年前
laravel_peng (作者) 2年前

怎么说也把响应内容截个图

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!