最近把我的服务器从CentOS7升级到了Ubuntu24.04,并把我的博客由蚂蚁笔记换成了Halo,正好Halo有图床插件集成了Lsky Pro,于是顺带并且部署了一个开源版本的Lsky Pro管理图床。在使用过程中正好发现这个开源的Lsky Pro有个接口有点小问题。

问题描述

集成插件中有功能可以指定一个相册的id把图片上传到这个相册中去,使用开源版本的Lsky Pro时这个功能无法生效,会直接上传到图库中。

排查解决过程

  1. 前端链路验证
    F12在network找到UploadImage请求查看负载参数,可以看到请求参数没问题
// 请求体结构验证
interface UploadParams {
  file: File;
  album_id: number; // 相册ID数值型参数 可选
  strategy: 'local' | 'remote';
}
  1. 后端服务追踪
    在插件作者Service Impl实现类中找到LskyImpl中的UploadImage方法,断点测试参数无异常
    @Override
    public Mono<ResultsVO> uploadImage(CommonQuery query, MultiValueMap<String, ?> multipartData) {
        Map<String, Object> paramMap = new HashMap(1);
        paramMap.put("file", multipartData);
        paramMap.put("album_id", query.getAlbumId());

        return req(query.getPictureBedId(), "upload", paramMap)
                .map(response -> {
                    if (response.status) {
                        return ResultsVO.success(response.message, response.data);
                    }
                    return ResultsVO.failure(response.message);
                });
    }
  1. Lsky Pro开源源码
    从API Controller中找到Upload接口,顺着代码逻辑找到app/Services/ImageService.php中具体实现的方法,发现这个实现完全没有处理相册ID的内容,只有上传到默认相册的逻辑。这边我给他补上了,内容很简单。
     /**
     * @param  Request  $request
     * @return Image
     * @throws UploadException
     */
    public function store(Request $request): Image
    {
        // 其他代码...
        // 默认储存策略
        if (! is_null($user)) {
            if (Utils::config(ConfigKey::IsUserNeedVerify) && ! $user->email_verified_at) {
                throw new UploadException('账户未验证');
            }

            if ($user->status !== UserStatus::Normal) {
                throw new UploadException('账号状态异常');
            }

            if ($file->getSize() / 1024 + $user->images()->sum('size') > $user->capacity) {
                throw new UploadException('储存空间不足');
            }

            # 2025-02-23 API接口传入相册后无法将图片上传到对应相册 
            # ------------------------修改前代码----------------------------
            // // 图片保存至默认相册(若有)
            // if ($albumId = $user->configs->get(UserConfigKey::DefaultAlbum)) {
            //     if ($user->albums()->where('id', $albumId)->exists()) {
            //         $image->album_id = $albumId;
            //     }
            // }
            #-------------------------修改后代码-----------------------------
            if ($request->has('album_id')) {
                // 获取 album_id 参数
                $albumId = $request->input('album_id');
                if ($user->albums()->where('id', $albumId)->exists()) {
                    $image->album_id = $albumId;  // 设置 album_id
                }
            }
            // 图片保存至默认相册(若有)
            else if (($albumId = $user->configs->get(UserConfigKey::DefaultAlbum))) {
                // 判断是否有默认相册 ID
                if ($user->albums()->where('id', $albumId)->exists()) {
                    $image->album_id = $albumId;  // 设置默认相册的 album_id
                }
            }
            #------------------------------end----------------------------------
            $image->user_id = $user->id;
            // 用户设置的图片默认权限
            $image->permission = $user->configs->get(UserConfigKey::DefaultPermission, ImagePermission::Private);
        }

        // 上传频率限制
        $this->rateLimiter($configs, $request);

        // 其他代码...

        return $image;
    }