TP^6.1文件上传有封装方法,如果不想用封装的,自定义上传怎么获取文件属性呢
目录
TP文件信息
打印上传文件信息
获取文件属性方法
1.获取文件大小(单位bytes)
2.获取文件后缀
3.获取文件上传路径
4.获取文件名称
5.上传文件
6.获取上传服务器错误
封装上传方法实现
代码如下
调用方法
返回结果
总结
TP文件信息
$file变量是一个\think\File对象,你可以获取相关的文件信息
支持使用SplFileObject类的属性和方法(SplFileObject是php环境中的类)
还有TP底层封装的UploadedFile类也有一些获取文件信息的属性和方法。
打印上传文件信息
think\file\UploadedFile Object
([test:think\file\UploadedFile:private] => [originalName:think\file\UploadedFile:private] => 2.jpg[mimeType:think\file\UploadedFile:private] => application/octet-stream[error:think\file\UploadedFile:private] => 0[hash:protected] => Array()[hashName:protected] => [pathName:SplFileInfo:private] => C:\Windows\php1A92.tmp[fileName:SplFileInfo:private] => php1A92.tmp
)
获取文件属性方法
1.获取文件大小(单位bytes)
$file->getSize();
2.获取文件后缀
$file->getOriginalExtension();
3.获取文件上传路径
$file->getPathname();
4.获取文件名称
$file->getOriginalName();
5.上传文件
$file->move($filePath, $newname);
参数1:要上传的路径
参数2:文件新名称
6.获取上传服务器错误
需要在请求接收文件时捕获异常
try {$file = request()->file('file');
} catch (\Exception $e) {print_r($e->getMessage());
}
封装上传方法实现
代码如下
*** 生成一个随机名字(当前的年月日时分秒+随机数字+后缀名)* @return string 文件的新名字*/
protected function randName()
{// 1, 生成文件的时间部分$name = date('YmdHis');// 2, 加上随机产生的6位数$str = '0987653214';for ($i = 0; $i < 6; $i++) {$name .= $str[mt_rand(0, strlen($str) - 1)];}return $name;
}/*** 实现文件上传* @param object $file 上传的文件的对象信息* @param string $path 文件上传的目录* @return string|array 上传失败返回原因 成功返回文件的新名字数组*/
public function move($file, $path)
{try {// 判断逻辑错误$maxSize = 80 * 1024;if ($file->getSize() > $maxSize) {return '上传失败,超出了文件限制的大小!';}// 判断文件类型$ext = strtolower($file->getOriginalExtension());if (!in_array($ext, ['png', 'jpg', 'jpeg', 'pdf', 'webp'], true)) {// 非法的文件类型return '上传的图片的类型不正确,允许的类型有:' . implode(',', $this->allowed_ext);}// 文件原名称(带扩展类型)$originalName = $file->getOriginalName();// 得到文件随机名称和相应文件夹$newname = $this->randName();$newname = $newname . '.' . $ext;$filePath = $this->rootPath . $path . '/' . date('Ymd') . '/';$file->move($filePath, $newname);return ['path' => $filePath . $newname];} catch (\Exception $e) {return $e->getMessage() . $e->getLine();}
}
调用方法
$name = $this->move($file, 'tp');
print_r($name);die;
返回结果
./uploads/tp/20230201/20230201142943441364.jpg
总结
这样自己利用底层方法,简单实现上传文件验证、保存就实现了。同样一个功能实现的方法有很多种,看你习惯使用哪个了。