关于 Dcat Admin 中的上传图片

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

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

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

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
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. 然后也根据日志文件,里面的报错信息可以让你快速定位问题位置,以及原因。

3年前 评论
mengdodo 3年前
laravel_peng (作者) 3年前
ta_ta (楼主) 3年前
ta_ta (楼主) 3年前
laravel_peng (作者) 3年前
laravel_peng (作者) 3年前
ta_ta (楼主) 3年前
laravel_peng (作者) 3年前
讨论数量: 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. 然后也根据日志文件,里面的报错信息可以让你快速定位问题位置,以及原因。

3年前 评论
mengdodo 3年前
laravel_peng (作者) 3年前
ta_ta (楼主) 3年前
ta_ta (楼主) 3年前
laravel_peng (作者) 3年前
laravel_peng (作者) 3年前
ta_ta (楼主) 3年前
laravel_peng (作者) 3年前
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. 然后也根据日志文件,里面的报错信息可以让你快速定位问题位置,以及原因。

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

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

3年前 评论

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