Thinkphp 6 Linux 服务器下无法上传图片

熊海
熊海

试了很多次不知道为什么linux上图片一直上传失败,windows服务器下一切正常,没办法,只得代码一行一行的看,一行行的去注释,最后发现是mime引起的,去掉TP上传方法中的mime就可以了

function upload($filename, $path, $imgx = '', $imgy = '', $fileSize = 5*1024*1024, $ext = 'jpg,jpeg,png,gif')
{

    // 上传文件错误或者文件验证不通过时,都会抛出异常,所以要使用try来捕捉异常
    try {
        // 获取上传的文件,如果有上传错误,会抛出异常
        // $file = \think\facade\Request::file('file');
        $file = \think\facade\Request::file($filename);
        // 如果上传的文件为null,手动抛出一个异常,统一处理异常
        if (null === $file) {
            // 异常代码使用UPLOAD_ERR_NO_FILE常量,方便需要进一步处理异常时使用
            throw new \Exception('请上传文件', UPLOAD_ERR_NO_FILE);
        }
        
        // 使用验证器验证上传的文件
        validate([
            'file' => [
                // 限制文件大小(单位b),这里限制为4M
                // 'fileSize' => 4 * 1024 * 1024,
                'fileSize' => $fileSize,
                // 限制文件后缀,多个后缀以英文逗号分割
                'fileExt' => $ext
            ]
            // 更多规则请看“上传验证”的规则,文档地址https://www.kancloud.cn/manual/thinkphp6_0/1037629#_444
            
        ])->check([
            'file' => $file
        ]);
        
        // 保存路径,实际保存路径为“磁盘路径” + “avatar”
        // $path = 'avatar';
        // 文件名规则,默认是当前时间。可以使用哈希算法,如:md5/sha1等,还可以传入匿名函数,详细可以看后面
        $rule = 'md5';
        // 将文件保存public磁盘,文件名为$rule指定的规则。然后将文件路径赋值给$path
        $path = \think\facade\Filesystem::disk('public')->putFile($path, $file, $rule);
        // 拼接URL路径
        $url = \think\facade\Filesystem::getDiskConfig('public', 'url') . '/' . str_replace('\\', '/', $path);

    } catch (\Exception $e) {
        // 如果上传时有异常,会执行这里的代码,可以在这里处理异常
        return ([
            'code' => 0,
            'msg' => $e->getMessage()
        ]);
    }
    

    $info = [
        // 文件路径:avatar/a4/e7b9e4ce42e2097b0df2feb8832d28.jpg
        'path' => $path,
        // URL路径:/storage/avatar/a4/e7b9e4ce42e2097b0df2feb8832d28.jpg
        'url' => $url,
        // 文件大小(字节)
        'size' => $file->getSize(),
        // 文件名:读书顶个鸟用.jpg
        'name' => $file->getFilename(),
        // 文件MINE:image/jpeg
        //'mime' => $file->getMime() //就是这个引起的
    ];
    
  
    
    // 裁剪图片
    if ($imgx && $imgy) {
        $image = \think\Image::open('storage/' . $path);
        $image->thumb($imgx, $imgy)->save('storage/' . $path);
    }
    
    // halt($info);
    return ([
        'code' => 1,
        'msg' => '上传成功',
        'data' => $info
    ]);
}


支付宝打赏支付宝 微信
微信扫一扫
2 条评论
快乐浪子哥
湖南省长沙市 2年前 2021-05-19 09:31
一直用tp6开发,没有你说的这样问题。而且你的这块写的有问题。既然用了try,你下面的从:$info到 return ([ 'code' => 1, 'msg' => '上传成功', 'data' => $info ]); 应该写到: $url = \think\facade\Filesystem::getDiskConfig('public', 'url') . '/' . str_replace('\\', '/', $path); 下面。。让\Exception $e下返回真实错误。具体你自己看看吧
熊海
2年前 2021-05-19 09:57
这个上传因为还有AJAX调用,写的没什么大问题,其实关键是Linux系统没有mime这个概念,windows才有mime类型。
太平
美国 2年前 2021-05-05 14:03
写提不错啊,支持一下支持一下支持一下!

评论:

发送