发新帖

[ThinkPHP] TP5 文件上传如何不要默认生成的时间子目录

零下一度 4天前 49

在ThinkPHP 5中,要取消文件上传时自动生成的时间格式子目录,可以通过以下几种方式实现:

方法一:设置上传配置(推荐)

在控制器中配置上传时,将subName设置为空数组或false:

public function upload()
{
    // 获取表单上传文件
    $file = request()->file('image');
    
    // 上传文件验证
    $info = $file->validate(['size' => 15678, 'ext' => 'jpg,png,gif'])
                 // 设置上传路径和规则
                 ->move('./uploads', true, false);
    
    if ($info) {
        // 成功上传后 获取上传信息
        echo $info->getSaveName();
    } else {
        // 上传失败获取错误信息
        echo $file->getError();
    }
}

或者更详细的配置方式:

public function upload()
{
    $file = request()->file('image');
    
    // 方式1:第三个参数设置为false
    $info = $file->move('./uploads', '', false);
    
    // 方式2:使用config方法配置
    $info = $file
        ->validate(['size' => 15678, 'ext' => 'jpg,png,gif'])
        ->rule('uniqid') // 使用唯一规则
        ->move('./uploads');
    
    if ($info) {
        echo $info->getSaveName();
    } else {
        echo $file->getError();
    }
}

方法二:自定义上传规则

public function upload()
{
    $file = request()->file('image');
    
    // 自定义文件名(不包含目录)
    $saveName = md5(uniqid()) . '.' . $file->getExtension();
    
    // 移动到框架应用根目录的uploads目录下
    $info = $file->move('./uploads', $saveName);
    
    if ($info) {
        echo $info->getSaveName(); // 输出:文件名
    } else {
        echo $file->getError();
    }
}

方法三:全局配置修改

在config.php或单独的上传配置文件中设置:

// config/filesystem.php 或 config.php
return [
    // 文件上传配置
    'upload' => [
        // 是否自动生成日期子目录
        'autoSub' => false,
        // 子目录创建方式
        'subName' => [], // 留空则不创建子目录
    ],
];

然后在控制器中:

public function upload()
{
    $file = request()->file('image');
    
    // 使用配置
    $info = $file->move('./uploads');
    
    if ($info) {
        echo $info->getSaveName();
    } else {
        echo $file->getError();
    }
}

方法四:使用validate方法链式配置

public function upload()
{
    $file = request()->file('image');
    
    $info = $file->validate([
            'size' => 15678,
            'ext'  => 'jpg,png,gif'
        ])
        ->rule(function () use ($file) {
            // 自定义文件名,不包含路径
            return md5(uniqid()) . '.' . $file->getExtension();
        })
        ->move('./uploads');
    
    if ($info) {
        echo $info->getSaveName();
    } else {
        echo $file->getError();
    }
}

方法五:修改源码配置(不推荐,仅供了解)

如果需要全局修改,可以修改think\File类,但这种方式不推荐,因为会影响框架升级。

注意事项:

安全性考虑:取消时间目录后,建议使用唯一文件名(如md5、uniqid)避免文件名冲突

文件管理:大量文件放在同一目录下可能会影响性能,建议定期清理或使用其他分类方式

getSaveName():当不生成子目录时,该方法只返回文件名,而不是路径

推荐使用第一种方法,在move()方法中将第三个参数设置为false,这是最简单直接的方式。






最新回复 (0)
返回
零下一度
主题数
957
帖子数
0
注册排名
1