处理文件
CodeIgniter 提供了一个 File 类,用于封装 SplFileInfo 类, 并提供一些额外的便捷方法。这个类也是 上传文件 和 图像 的基类。
获取 File 实例
通过在构造函数中传入文件路径,即可创建新的 File 实例。
$file = new \CodeIgniter\Files\File($path);
默认情况下,文件不需要实际存在。不过,可额外传入参数 true 来检查文件是否存在;
如果不存在,则抛出 FileNotFoundException()。
利用 Spl 的能力
获得实例后,即可使用 SplFileInfo 类的完整功能,包括:
// Get the file's basename
echo $file->getBasename();
// Get last modified time
echo $file->getMTime();
// Get the true real path
echo $file->getRealPath();
// Get the file permissions
echo $file->getPerms();
// Write CSV rows to it.
if ($file->isWritable()) {
$csv = $file->openFile('w');
foreach ($rows as $row) {
$csv->fputcsv($row);
}
}
新增功能
除了 SplFileInfo 类的全部方法外,File 还提供了一些新工具。
getRandomName()
通过 getRandomName() 方法,可生成一个密码学安全的随机文件名,并在前面附加当前时间戳。
在移动文件时,这对于重命名文件特别有用,因为文件名将无法被猜测:
// Generates something like: 1465965676_385e33f741.jpg
$newName = $file->getRandomName();
getSize()
返回文件大小,单位为字节:
$size = $file->getSize(); // 256901
如果文件不存在或发生错误,将抛出 RuntimeException。
getSizeByUnit()
自 4.6.0 版本弃用.
默认以字节为单位返回文件大小。第一个参数可传入 'kb' 或 'mb',
分别以 KiB 或 MiB 返回结果:
$bytes = $file->getSizeByUnit(); // 256901
$kilobytes = $file->getSizeByUnit('kb'); // 250.880
$megabytes = $file->getSizeByUnit('mb'); // 0.245
如果文件不存在或发生错误,将抛出 RuntimeException。
getSizeByBinaryUnit()
Added in version 4.6.0.
默认以字节为单位返回文件大小。第一个参数可传入不同的 FileSizeUnit 值, 分别以 KiB、MiB 等单位返回结果。第二个参数可传入精度值,用于定义小数位数。
$bytes = $file->getSizeByBinaryUnit(); // 256901
$kibibytes = $file->getSizeByBinaryUnit(FileSizeUnit::KB); // 250.880
$mebibytes = $file->getSizeByBinaryUnit(FileSizeUnit::MB); // 0.245
如果文件不存在或发生错误,将抛出 RuntimeException。
getSizeByMetricUnit()
Added in version 4.6.0.
默认以字节为单位返回文件大小。第一个参数可传入不同的 FileSizeUnit 值, 分别以 kB、MB 等单位返回结果。第二个参数可传入精度值,用于定义小数位数。
$bytes = $file->getSizeByMetricUnit(); // 256901
$kilobytes = $file->getSizeByMetricUnit(FileSizeUnit::KB); // 256.901
$megabytes = $file->getSizeByMetricUnit(FileSizeUnit::MB); // 0.256
如果文件不存在或发生错误,将抛出 RuntimeException。
getMimeType()
获取文件的媒体类型(MIME 类型)。在判定文件类型时,会尽可能使用被认为更安全的方 法:
$type = $file->getMimeType();
echo $type; // image/png
guessExtension()
尝试基于可信的 getMimeType() 方法判断文件扩展名。如果 MIME 类型未知,则返回
null。与直接使用文件扩展名相比,这通常更可信。扩展名的判断依据为
app/Config/Mimes.php 中的值:
// Returns 'jpg' (WITHOUT the period)
$ext = $file->guessExtension();
移动文件
每个文件都可以使用 move() 方法移动到新位置。第一个参数为要移
动到的目录:
$file->move(WRITEPATH . 'uploads');
默认使用原始文件名。第二个参数可传入新的文件名:
$newName = $file->getRandomName();
$file->move(WRITEPATH . 'uploads', $newName);
move() 方法会返回一个新的 File 实例,表示已重新定位的文件。因此,如需使
用新位置,必须保存返回结果:
$file = $file->move(WRITEPATH . 'uploads');