thinkphp6文件上传自定义命名规则
think官方自带的命名规则有三种
规则 | 描述 |
---|---|
date | 根据日期和微秒数生成 |
md5 | 对文件使用md5_file散列生成 |
sha1 | 对文件使用sha1_file散列生成 |
其中md5和sha1规则会自动以散列值的前两个字符作为子目录,后面的散列值作为文件名。
使用md5和sha1可以对文件进行重复上传判断,但是会把前两个字符作为目录名,而我想要的是目录名是日期时间命令,所以我改装了一下官方的
代码
public function upload(){
$files = request()->file();
$file = request()->file('file');
if($file==null){
exit(json_encode(array('code'=>1,'msg'=>'没有文件上传')));
}
try {
validate(['file'=>'filesize:1000240|fileExt:jpg,png,gif,jpeg'])->check($files);
$info = \think\facade\Filesystem::disk('public')->putFile('bews',$file,function () use ($file){
switch ('hash') {
case 'date':
$fileName = date('YmdHis').rand(1000,9999);
break;
case 'hash':
$hash = hash_file('sha1',$file);
$fileName = date('Ymd'). DIRECTORY_SEPARATOR .$hash;
break;
default:
// 这个可以自定义文件名,也可以使用生成的唯一ID
//$fileName = uniqid();
$fileName = '我是自定义的名字'; //不需要带文件后缀
break;
}
return $fileName;
});
} catch (\think\exception\ValidateException $e) {
exit(json_encode(array('code'=>1,'msg'=>$e->getMessage())));
}
$info = str_replace("\\","/",$info);
$img = '/storage/'.$info;
exit(json_encode(array('code'=>0,'data'=>$img,'url'=>$img)));
}