PHP工作记录——文件管理类的封装

断了今生、忘了曾经 提交于 2019-12-05 03:49:41

<?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;
  }
}
?>

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!