在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,这是最简单直接的方式。