_create_folder($toFile); $folder1 = opendir($fromFile); while ($folder1 && $f1 = readdir($folder1)) { if ($f1 != "." && $f1 != "..") { $path2 = "{$fromFile}/{$f1}"; if (is_file($path2)) { $file = $path2; $newfile = "{$toFile}/{$f1}"; copy($file, $newfile); } elseif (is_dir($path2)) { $toFiles = $toFile.'/'.$f1; $this->copy_file($path2, $toFiles); } } } } // 复制目录 // 源文件目录$basedir,源文件目录$filepath,新文件目录$savepath public function copy_dir($basedir, $filepath, $savepath){ if ($dh = opendir($basedir)) { while (($file = readdir($dh)) !== false) { if (strpos($file, '.') !== 0){ if (!is_dir($basedir."/".$file)) { $fl = str_replace($filepath, '', $basedir."/".$file); dr_mkdirs(dirname($savepath.$fl)); $code = file_get_contents($basedir."/".$file); file_put_contents($savepath.$fl, $code); }else{ $dirname = $basedir."/".$file; $this->copy_dir($dirname, $filepath, $savepath); } } } closedir($dh); } } /** * 递归创建文件夹 */ public function _create_folder($dir, $mode = 0777){ if (is_dir($dir) || mkdir($dir, $mode)) { return true; } if (!$this->_create_folder(dirname($dir), $mode)) { return false; } return mkdir($dir, $mode); } /** * sql执行文件插入 */ public function add_sql_cache($sql) { if (!$sql) { return; } $file = WRITEPATH.'temp/sql.cache'; $data = is_file($file) ? json_decode(file_get_contents($file)) : []; if (dr_in_array($sql, $data)) { return ; } $data[] = $sql; file_put_contents($file, dr_array2string($data)); return; } /** * sql执行文件插入 */ public function get_sql_cache() { $file = WRITEPATH.'temp/sql.cache'; return is_file($file) ? json_decode(file_get_contents($file)) : array(); } /** * base64 */ public function base64_image($image_file) { $image_info = getimagesize($image_file); $image_data = fread(fopen($image_file, 'r'), filesize($image_file)); $base64_image = 'data:' . $image_info['mime'] . ';base64,' . chunk_split(base64_encode($image_data)); return $base64_image; } protected function _zip_error($code) { $error = [ 1 => '不支持多磁盘zip压缩包', 2 => '重命名临时文件失败', 3 => '关闭zip压缩包失败', 4 => '寻址错误', 5 => '读取错误', 6 => '写入错误', 7 => 'CRC校验失败', 8 => 'zip压缩包已关闭', 9 => '没有文件', 10 => '文件已经存在', 11 => '不能打开文件', 12 => '创建临时文件失败', 13 => 'Zlib错误', 14 => '内存分配失败', 15 => '条目已被改变', 16 => '不支持的压缩方式', 17 => '过早的EOF', 18 => '无效的参数', 19 => '不是一个zip压缩包', 20 => 'Internal', 21 => 'Zip压缩包不一致', 22 => '不能移除文件', 23 => '条目已被删除', ]; return isset($error[$code]) ? $error[$code] : $code; } // zip解压 public function unzip($zipfile, $path = '') { if (!class_exists('ZipArchive')) { return 0; } elseif (!$zipfile || !is_file($zipfile)) { return 0; } !$path && $path = dirname($zipfile); // 当前目录 $zip = new \ZipArchive;//新建一个ZipArchive的对象 /* 通过ZipArchive的对象处理zip文件 $zip->open这个方法的参数表示处理的zip文件名。 如果对zip文件对象操作成功,$zip->open这个方法会返回TRUE */ if ($zip->open($zipfile) === TRUE) { $zip->extractTo($path);//假设解压缩到在当前路径下images文件夹的子文件夹php $zip->close();//关闭处理的zip文件 return 1; } return 0; } // zip压缩 public function zip($zfile, $path, $remove = []) { if (!class_exists('ZipArchive')) { return dr_lang('PHP环境不支持ZipArchive类'); } elseif (!$path) { return dr_lang('目录参数为空'); } $zpath = dirname($zfile); if (!is_dir($zpath)) { dr_mkdirs($zpath); } $zip = new \ZipArchive; $code = $zip->open($zfile, \ZipArchive::OVERWRITE | \ZipArchive::CREATE); if ($code !== TRUE) { return dr_lang('创建Zip文件失败#%s', $this->_zip_error($code)); } $this->_create_zip(opendir($path), $zip, $path, '', $remove); $zip->close(); if (!is_file($zfile)) { return dr_lang('文件压缩失败'); } return ''; } /*压缩多级目录 $openFile:目录句柄 $zipObj:Zip对象 $sourceAbso:源文件夹路径 */ protected function _create_zip($openFile, $zipObj, $sourceAbso, $newRelat = '', $remove = []) { while (($file = readdir($openFile)) != false) { if ($file=="." || $file=="..") { continue; } /*源目录路径(绝对路径)*/ $sourceTemp = $sourceAbso.'/'.$file; /*目标目录路径(相对路径)*/ $newTemp = $newRelat=='' ? $file : $newRelat.'/'.$file; if (is_dir($sourceTemp)) { if ($remove) { $rk = 0; foreach ($remove as $r) { if (substr($r, 0, 1) == '*') { if (strpos($sourceTemp, trim($r,'*')) !== false) { $rk = 1; break; } } else { if ($sourceTemp == $r) { $rk = 1; break; } } } if ($rk) { continue; } } //echo '创建'.$newTemp.'文件夹
'; $zipObj->addEmptyDir($newTemp);/*这里注意:php只需传递一个文件夹名称路径即可*/ $this->_create_zip(opendir($sourceTemp), $zipObj, $sourceTemp, $newTemp, $remove); } if (is_file($sourceTemp)) { //echo '创建'.$newTemp.'文件
'; $zipObj->addFile($sourceTemp, $newTemp); } } } /*下载文件 储存路径 访问地址 文件名含扩展名 */ public function down($file, $url, $name) { //大文件在读取内容未结束时会被超时处理,导致下载文件不全。 set_time_limit(0); $handle = fopen($file,"rb"); if (FALSE === $handle) { \Phpcmf\Service::C()->_msg(0, dr_lang('文件已经损坏')); } $size = min(defined('SYS_ATTACHMENT_DOWN_SIZE') ? (int)SYS_ATTACHMENT_DOWN_SIZE : 50, 50); $filesize = filesize($file); if ($filesize > 1024 * 1024 * $size) { // 大文件转向 if (IS_DEV) { log_message('debug', '由于文件大于'.$size.'MB,重命名文件功能将失效,下载地址将跳转到文件本身的地址'); } dr_redirect($url); } else { header('Content-Type: application/octet-stream'); header("Accept-Ranges:bytes"); header("Accept-Length:".$filesize); header("Content-Disposition: attachment; filename=".urlencode($name)); while (!feof($handle)) { $contents = fread($handle, 4096); echo $contents; ob_flush(); //把数据从PHP的缓冲中释放出来 flush(); //把被释放出来的数据发送到浏览器 } fclose($handle); } } }