已完成 - 打包项目上传文件失败

凌晨三点半的卢本伟

问题描述

打包后,修改用户头像 抛出
Can't write image data to path (phar:///www/wwwroot/webman_pack/build/webman.phar/plugin/admin/public/upload/avatar/202405/663dc6f47d0b.lg.jpg)

操作过程

根据打包文档配置 https://www.workerman.net/doc/webman/others/phar.html

1.config/plugin/webman/console/app.php 配置

'exclude_pattern' => '#^(?!.*(composer.json|/.github/|/.idea/|/.git/|/.setting/|/runtime/|/vendor-bin/|/build/|vendor/webman/admin))(.*)$#'

config/app.php配置

'public_path' => base_path(false) . DIRECTORY_SEPARATOR . 'public',

为此你搜索到了哪些方案及不适用的原因

1.修改插件内的上传头像源码,重新打包,再上传头像提示
删除了/plugin/admin/ 拼接
截图
提示 Can’t write image data to path (phar:///www/wwwroot/webman_pack/webman.phar/public/upload/avatar/202405/663dd032ca59.lg.png)
2.帖子 https://www.workerman.net/q/8086 根据老大提供的方法改了,也提示上传路径有误

备注:文件给了777权限

2024-5-13 已更新 (需求是打包后后台上传文件,以webman-admin 上传头像为例)

1.照文档配置更改 https://www.workerman.net/doc/webman/others/phar.html
2.更改后台插件上传头像配置(其他上传自行测试)路径为 项目根目录/plugin/admin/app/controller/UploadController.php/avatar

/**
     * 上传头像
     * @param Request $request
     * @return Response
     * @throws Exception
     */
    public function avatar(Request $request): Response
    {
        $file = current($request->file());
        if ($file && $file->isValid()) {
            $ext = strtolower($file->getUploadExtension());
            if (!in_array($ext, ['jpg', 'jpeg', 'gif', 'png'])) {
                return json(['code' => 2, 'msg' => '仅支持 jpg jpeg gif png格式']);
            }
            $image = Image::make($file);
            $width = $image->width();
            $height = $image->height();
            $size = min($width, $height);
            $relative_path = 'upload/avatar/' . date('Ym');
            $real_path = "./public/$relative_path";//这个是上传路径更改
            print_r($real_path);
            if (!is_dir($real_path)) {
                mkdir($real_path, 0777, true);
            }
            $name = bin2hex(pack('Nn',time(), random_int(1, 65535)));
            $ext = $file->getUploadExtension();

            $image->crop($size, $size)->resize(300, 300);
            $path = "./public/$relative_path/$name.lg.$ext";//这个是上传路径更改
            $image->save($path);

            $image->resize(120, 120);
            $path = "./public/$relative_path/$name.md.$ext";//这个是上传路径更改
            $image->save($path);

            $image->resize(60, 60);
            $path = "./public/$relative_path/$name.$ext";//这个是上传路径更改
            $image->save($path);

            $image->resize(30, 30);
            $path = "./public/$relative_path/$name.sm.$ext";//这个是上传路径更改
            $image->save($path);

            return json([
                'code' => 0,
                'msg' => '上传成功',
                'data' => [
                    'url' => "/public/$relative_path/$name.$ext" //这个是上传后回显的路径
                ]
            ]);
        }
        return json(['code' => 1, 'msg' => 'file not found']);
    }

实现效果,跟未打包前上传文件一致

截图
截图

打包后完整目录

截图

备注:

1.我的打包命令为(项目根目录) php -d phar.readonly=0 ./webman build:phar
2.如果更新插件官方后台,则会覆盖当前修改的代码,切记

368 1 0
1个回答

你试试
\Phar::running() ? pathinfo(\Phar::running(false), PATHINFO_DIRNAME) . '/public' : realpath(base_path() . '/../public');

  • 凌晨三点半的卢本伟 2024-05-13

    打包后上传文件没有问题,现在是上传后回显不对,还在调试,等调试完成再更新当前文章

  • 岛屿可以找到海 2024-05-15

    我这两天在做图片上传也遇到这个问题了,我是使用的use Intervention\Image\ImageManagerStatic库对图片进行压缩处理然后调用保存也出现了Intervention\Image\Exception\NotWritableException: Can't write image data to path报错,但是测试用webman的move方法保存就不会出错,保存的路径都是相同的,最后的结局方案就是,输出图片二进制数据然后用 file_put_contents保存

  • 凌晨三点半的卢本伟 2024-05-15

    我之前保存失败的原因的文件夹路径不对,改了上传路径就文艺问题了

×
🔝