关于 Dcat Admin 中的上传图片

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

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

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

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 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年前 评论

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