Algunos proyectos serán utilizados en las operaciones de archivo habituales en esta clase encapsula una operación simple de archivos, para su uso posterior.
class FileOperations
{
public function __construct()
{
//引入PclZip压缩解压缩类
include_once 'pclzip/PclZip.php';
}
/**
* @param string $file_name 压缩后文件名称
* @param array $path 文件数组
* @return array
*/
public function toZip($file_name, $path)
{
$res = array();
$archive = new PclZip($file_name);
$v_list = $archive->create($path, PCLZIP_OPT_REMOVE_ALL_PATH);
if ($v_list == 0) {
$res['status'] = 0;
$res['msg'] = '源文件不存在!<br>' . $archive->errorInfo(true);
} else {
$res['status'] = 1;
$res['msg'] = '文件打包完成!';
$res['fileName'] = basename($file_name);
}
return $res;
}
/**
* @param arrar $folderArr 文件夹路径数组
* @return array 文件目录列表中所有子目录文件路径
*/
public function getArrFileList($folderArr)
{
$file_list = [];
if (is_array($folderArr) && count($folderArr) > 0) {
foreach ($folderArr as $file) {
if (is_dir($file)) {
$list = $this->getFileList($file);
foreach ($list as $flist)
$file_list[] = $flist;
} else {
$file_list[] = $file;
}
}
}
return $file_list;
}
/** 获取文件夹下所有子文件路径并存放到一个数组中
* @param String $path 文件夹
* @return array
*/
public function getFileList($path)
{
$list = array();
foreach (glob($path . '/*') as $single) {
if (is_dir($single)) {
$list = array_merge($list, $this->getFileList($single));
} else {
$list[] = $single;
}
}
return $list;
}
/** 获取文件size大小
* @param string $file 文件路径
*/
public function getFileSize($file)
{
$byt = 1024;
$mb = pow($byt, 2);
$file_szie = filesize($file);
if ($file_szie >= $mb) {
$fsize = round($file_szie / $mb, 1) . 'mb';
} elseif ($file_szie >= $byt) {
$fsize = round($file_szie / $byt, 1) . 'kb';
} else {
$fsize = $file_szie . 'bytes';
}
return $fsize;
}
/** 判断文件夹是否存在,不存在则创建
* @param string $dir 要创建的文件夹
*/
public function createDir($dir)
{
if (!is_dir($dir)) {
mkdir($dir, 0777, true); //创建目录,第三个参数可选,规定是否设置递归模式。(PHP 5 中新增的)
}
}
/** 复制带有多级子目录的文件夹
* @param string $source 要复制的文件对象路径
* @param string $target 复制到的目标文件路径
* @param bool $remove 是否删除
* @return bool|string
*/
public function copyDir($dirSrc, $dirTo, $remove = false)
{
// 检查原始目录是否存在, 不存在则退出
if (!file_exists($dirSrc)) {
return 'source_error';
}
$this->createDir($dirTo); //判断目标文件夹是否存在,不存在则创建
if ($dir_handle = opendir($dirSrc)) { //打开目录,并判断是否能成功打开
while ($filename = readdir($dir_handle)) { //循环遍历目录下的所有文件
if ($filename != "." && $filename != "..") { //一定要排除两个特殊的目录
$subFile = $dirSrc . "/" . $filename; //将目录下的子文件和当前目录相连
$sunToFile = $dirTo . "/" . $filename; //将目标目录的多级子目录相连
if (is_dir($subFile)) //如果为目录则条件成立
$this->copyDir($subFile, $sunToFile); //递归调用自己复制子目录
if (is_file($subFile)) //如果是文件则条件成立
copy($subFile, $sunToFile); //直接复制到目标位置
}
}
closedir($dir_handle); //关闭文件资源
}
if ($remove == true) //是否删除原始文件
$this->delDir($dirSrc);
}
/** 删除目录及目录下所有文件
* @param string $dir 文件夹路径
*/
public function delDir($dir)
{
$res = 0;
if (is_dir($dir)) {
if ($delHandle = opendir($dir)) {
while (($file = readdir($delHandle)) != false) {
if ($file != '..' && $file != '.') {
if (is_dir($dir . '/' . $file)) // 是目录
{
$this->delDir($dir . '/' . $file); // 是目录则递归继续进入该目录中去删除其中的文件
} else // 是文件
{
unlink($dir . '/' . $file); // 则直接删除文件
}
}
}
}
closedir($delHandle);
$res = rmdir($dir); //删除空的目录
} else {
if (is_file($dir)) {
$res = unlink($dir);
}
}
return $res;
}
/** 文件导出/下载
* @param string $filePath 文件路径
*/
public function expotFile($filePath)
{
Header("Content-type: text/html; charset=utf-8");
if (!file_exists($filePath)) {
exit("文件不存在!");
} else {
$fileName = iconv("utf-8", "gb2312//IGNORE", basename($filePath)); //转码
$fileSize = filesize($filePath); //文件大小
$file = fopen($filePath, "rw");
Header("Content-type: application/octet-stream");
Header("Accept-Ranges: bytes");
Header("Accept-Length: " . $fileSize);
Header("Content-Disposition: attachment; filename=" . $fileName);
echo fread($file, $fileSize);
fclose($file);
}
}
/**
* @param $filePath 要下载的文件路径
* @param array $allowDownExt 允许下载的文件扩展名数组
*/
function downFile($filePath, $allowDownExt = ['zip'])
{
header("Content-type: text/html; charset=utf-8");
if (!is_file($filePath) || !is_readable($filePath)) {
exit("文件不存在或者不可读!");
}
$ext = strtolower(pathinfo($filePath, PATHINFO_EXTENSION));
if (!in_array($ext, $allowDownExt)) {
exit("不允许的文件格式!");
}
$fileName = iconv("utf-8", "gb2312//IGNORE", basename($filePath)); //转码
$fileSize = filesize($filePath); //文件大小
// 对当前文档禁用缓存
/*header('Cache-Control: no-cache, no-store, max-age=0, must-revalidate');
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past
header('Pragma: no-cache');*/
header("content-type: application/octet-stream");
header("Accept-Ranges: bytes");
header("Accept-Length: " . $fileSize);
header("Content-Disposition: attachment; filename=" . $fileName);
$read_buffer = 1024;
$sum_buffer = 0;
$handle = fopen($filePath, 'rb');
while (!feof($handle) && ($sum_buffer < $fileSize)) {
echo fread($handle, $read_buffer);
$sum_buffer += $read_buffer;
}
fclose($handle);
exit;
}
}