<?php
/**
* ZFile Class
* 文件管理类
*/
class File
{
/**
* 文件上传函数
* @param string $file 表单提交的文件
* @param string $save_dir 文件保存路径,相对于当前目录
* @return array $response (
* ['status']=>上传成功为true, 上传失败为false
* ['path'] => array( 已成功的文件路径 )
* ['error'] => array( 失败信息 )
* )
**/
public function upload($file, $save_dir)
{
//var_dump($file);
//文件临时储存位置
$file_tmp_path = $_FILES['files']['tmp_name'];
//文件名
$file_name = $_FILES['files']['name'];
$response = array();
$response['status'] = array();
$response['path'] = array();
$response['error'] = array();
//判断目录是否存在
if (!file_exists($save_dir)) {
//不存在则创建
if (false == mkdir($save_dir, 0777, true)) {
$response['staus'] = false;
$response['error'][] = '文件保存路径错误,路径"'.$save_dir.'"创建失败';
}
}
$pathnifo = pathinfo($file_tmp_path);
$suffix = pathinfo($save_name, PATHINFO_EXTENSION);
copy($file_tmp_path, $save_dir.D_S.$file_name);
if (file_exists($save_dir.D_S.$file_name)) {
$response['status'] = true;
$response['path'] = $save_dir.D_S.$file_name;
} else {
$response['status'] = false;
}
return $response;
}
/**
* 下载(下载其他URL的文件)
* @param string $url 需要下载的链接
* @param string $savepath 存放路径
* @param string $name 保存名字(为空的话则用时间戳代替)
* @return string $savename 返回下载后的文件路径
*/
public function download($url, $savepath, $name)
{
$ext = pathinfo($url, PATHINFO_EXTENSION);
if (empty($name)) {
$name = time().'.'.$ext;
} else {
$name = $name.'.'.$ext;
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_URL, $url);
ob_start();
curl_exec($ch);
$content = ob_get_contents();
if (empty($content)) {
throw new ZException("url is not exists");
}
ob_end_clean();
if (!file_exists($savepath)) {
mkdir($savepath);
}
$savename = $savepath.D_S.$name;
$fp = fopen($savename, "a");
@fwrite($fp, $content);
return $savename;
}
public function copyfile($source, $target, $overwrite = true)
{
return $this->fileOp($source, $target, $movetype = 'copy', $overwrite);
}
/**
* 移动路径,存储点之间移动(复制/移动)
* @param string $source 指定要操作文件夹路径
* @param string $target 指定新文件夹路径
* @param string $movetype 操作类型'copy'or'move'(默认是copy)
* @param boolean $overwrite 是否覆盖已存在文件,默认是true,覆盖
*/
private function fileOp($source, $target,$movetype = 'copy', $overwrite = true)
{
if (!file_exists($source)) {
throw new ZException("File is not exists");
}
if (!file_exists($target)) {
mkdir($target);
}
//目标是单个文件的处理方式
if (is_file($source)) {
if (file_exists($target.D_S.basename($source))) {
//需要覆盖则copy,不需要则跳过
if ($overwrite) {
copy($source, $target.D_S.basename($source));
}
} else {
copy($source, $target.D_S.basename($source));
}
switch ($movetype) {
case 'copy':
break;
case 'move':
unlink($source);
break;
}
} else {
//目标是目录的处理方式
$dir = opendir($source);
$filename = readdir($dir);
while ($filename = readdir($dir)) {
if ($filename!=='.' && $filename!=='..' && $filename !== '.svn') {
$srcfile = $source.D_S.$filename;//源文件路径
$tofile = $target.D_S.$filename;//目标文件
if (is_dir($srcfile)) {
$this->fileOp($srcfile, $tofile, $movetype);
} else {
if (file_exists($tofile)) {
if ($overwrite) {
copy($srcfile, $tofile);
}
} else {
copy($srcfile, $tofile);
}
}
}
}
closedir($dir);
switch ($movetype)
{
case 'copy':
break;
case 'move':
$this->removeDir($source);
break;
}
return true;
}
}
/**
* 递归删除目录下的文件
* @param string $path 目录路径
* @param boolean $retain 是否保留目录,默认保留
**/
public function removeDir($path, $retain = true)
{
if (!is_dir($path))
throw new ZException("this is not a correct dir");
if (is_dir($path)) {
$p = scandir($path);
foreach ($p as $val) {
if ($val !=='.'&&$val !=='..') {
if (is_dir($path.D_S.$val)) {
$this->removeDir($path.D_S.$val, $retain);
@rmdir($path.D_S.$val);
} else {
unlink($path.D_S.$val);
}
}
}
}
if (!$retain) {
@rmdir($path);
}
}
/**
* 列表
* @param string $path 目录路径
* @param boolean $Detail 是否获取包含子目录下所有文件路径,默认为false
* @return array $arr 文件路径列表
**/
public function getDirFileList($path, $Detail = false)
{
if(!is_dir($path))
throw new ZException("不是合法路径");
$arr = array();
//不需要列出子目录文件
if (!$Detail) {
$data = scandir($path);
foreach ($data as $value) {
if ($value != '.' && $value != '..') {
$arr[] = $path.D_S.$value;
}
}
} else {
if ($handle = opendir($path)) {
while (($file = readdir($handle)) !== false) {
if ($file != "." && $file != "..") {
if (is_dir($path.D_S.$file)) {
$arr[] = $this->getDirFileList($path.D_S.$file, $Detail);
} else {
$arr[] = $path.D_S.$file;
}
}
}
@closedir($path);
}
}
return $arr;
}
public function copy_file($filename, $dest)
{
if (!is_dir($dest)) {
mkdir($dest, 0777, true);
}
$destName = $dest.DIRECTORY_SEPARATOR.basename($filename);
if (copy($filename, $destName)) {
return true;
}
return false;
}
}
?>