当前位置:首页 > 网站技术 > 后端技术 > 正文内容

PHP入门基础之文件操作函数封装

小彬2020-07-10后端技术219

1、php创建函数的注释

使用vscode 编辑器,安装vs docblocker , 输入/** 回车

如下    

/**
 * [create_file description] (函数作用)
 *
 * @param   string  $filename  [$filename description] 
 *
 * @return  [type]             [return description]
 */

2、php创建文件操作函数-file.func.php

首先当然要有php环境,我是直接装的phpstudy,通过集成可以很快的实现php环境

<?php 



/**
 * [create_file 创建文件]
 *
 * @param   string  $filename  [$filename 文件名]
 *
 * @return  [type]             [return boolean]
 */
  function create_file(string $filename){
    //检测文件是否存在,不存在则创建,存在则退出函数
    if(file_exists($filename)){
      return false;
    }
    //检测目录是否存在,不存在则创建
      //(如'/project/sqss/1.php',则project目录在当前磁盘的下级)
      //如'project/sqss/1.php',则project目录在当前目录的下级
    if(!file_exists(dirname($filename))){
       mkdir(dirname($filename),0777,true);
    }
    //设定文件的访问和修改时间,如果文件不存在,则会被创建
    if(touch($filename)){
      return true;
    }
    return false;
  }




/**
 * [del_file 删除文件]
 *
 * @param   string  $filename  [$filename 文件名]
 *
 * @return  [type]             [return boolean]
 */
  function del_file(string $filename){
    //   检测文件是否存在,并且是否有权限操作
      if(!file_exists($filename)||!is_writable($filename)){
          return false;
      }
    //   如果存在,则删除文件
      if(unlink($filename)){
          return true;
      }
      return false;
  }



/**
 * [copy_file 拷贝文件]
 *
 * @param   string  $filename  [$filename 文件名]
 * @param   string  $dest      [$dest 目录]
 *
 * @return  [type]             [return boolean]
 */
  function copy_file(string $filename,string $dest){
    //   判断$dest是否为一个目录并且是否存在,不存在则创建
    if(!is_dir($dest)){
        mkdir($dest,0777,true);
    }
    // windows
    $destName=$dest.'/'.basename($filename);
    // linux
    // $desName=$dest.DIRECTORY_SEPARATOR.basename($filename);
    //检测目标路径下是否存在同名文件
    if(file_exists($destName)){
        return false;
    }
    // 拷贝文件
    if(copy($filename,$destName)){
        return true;
    }
    return false;
  }




  /**
   * [rename_file 重命名]
   *
   * @param   string  $oldName  [$oldName 原文件名]
   * @param   string  $newName  [$newName 新文件名]
   *
   * @return  [type]            [return boolean]
   */
  function rename_file(string $oldName, string $newName){
    // 检测源文件是否存在
    if(!is_file($oldName)){
      return false;
    }
    // 得到源文件目录
    $path=dirname($oldName);
    $destName=$path.'/'.$newName;
    if(file_exists($destName)){
      return false;
    }
    // 当$olaName和$newName同在一个目录时,使用$newName|$destName一样
    // 否则使用$destName,并且还要添加“没有目录则创建目录”的代码(此为剪切方法 cut_file()函数)
    if(rename($oldName,$newName)){
      return true;
    }
    return false;
  }




  /**
   * [cut_file 剪切文件]
   *
   * @param   string  $filename  [$filename 文件名]
   * @param   string  $dest      [$dest 移动的目录]
   *
   * @return  [type]             [return boolean]
   */
  function cut_file(string $filename, string $dest){
    // 检测源文件是否存在
    if(!is_file($filename)){
      return false;
    }
    //   判断$dest是否为一个目录并且是否存在,不存在则创建
    if(!is_dir($dest)){
      mkdir($dest,0777,true);
    }
    // windows
    $destName=$dest.'/'.basename($filename);
    // linux
    // $desName=$dest.DIRECTORY_SEPARATOR.basename($filename);
    //检测目标路径下是否存在同名文件
    if(file_exists($destName)){
        return false;
    }
    if(rename($filename,$destName)){
      return true;
    }
    return false;
  }




/**
 * [get_file_info 获取文件信息]
 *
 * @param   string  $filename  [$filename 文件名]
 *
 * @return  [type]             [return 文件信息]
 */
  function get_file_info(string $filename){
    if(!file_exists($filename)||!is_readable($filename)){
      return false;
    }
    return [
      'atime'=>date("Y-m-d H:i:s",fileatime($filename)),
      'mtime'=>date('Y-m-d H:i:s',filemtime($filename)),
      'ctime'=>date('Y-m-d H:i:s',filectime($filename)),
      '文件大小'=>trans_byte(filesize($filename)),
      '文件类型'=>filetype($filename), 
    ];
  }



  /**
   * [trans_byte 字节单位]
   *
   * @param   int  $byte       [$byte 字节]
   * @param   int  $precision  [$precision 默认保留小数后2位数]
   *
   * @return  [type]           [return boolean]
   */
  function trans_byte(int $byte, int $precision=2){
    $kb=1024;
    $mb=1024*$kb;
    $gb=1024*$mb;
    $tb=1024*$gb;
    if($byte<$kb){
      return $byte.'B';
    }elseif($byte<$mb){
      return round($byte/$kb,$precision).'KB';
    }elseif($byte<$gb){
      return round($byte/$mb,$precision).'MB';
    }elseif($byte<$tb){
      return round($byte/$gb,$precision).'GB';
    }else {
      return round($byte/$tb,$precision).'TB';
    }
  }



  /**
   * [read_file 读取文件]
   *
   * @param   string  $filename  [$filename 文件名]
   *
   * @return  [type]             [return 文件信息]
   */
  function read_file(string $filename){
    // 检测是否为文件且文件已存在
    if(is_file($filename) && is_readable($filename)){
      return file_get_contents($filename);
    }
    return false;
  }



/**
 * [read_file_array 把文件内容转成数组]
 *
 * @param   string  $filename          [$filename 文件名]
 * @param   bool    $skip_empty_lines  [$skip_empty_lines 是否过滤空行]
 * @param   false                      [ 默认值为false]
 *
 * @return  [type]                     [return 文件内容]
 */
  function read_file_array(string $filename, bool $skip_empty_lines=false){
    if(is_file($filename) && is_readable($filename)){
      if($skip_empty_lines){
        return file($filename,FILE_IGNORE_NEW_LINES|FILE_SKIP_EMPTY_LINES);
      }else{
        return file($filename);
      }
    }
    return false;
  }




/**
 * [write_file 向文件写入内容]
 *
 * @param   string  $filename  [$filename 文件名]
 * @param   [type]  $data      [$data 数组或对象数据]
 *
 * @return  [type]             [return boolean]
 */
  function write_file(string $filename, $data){
    // 获取目录
    $dirname=dirname($filename);
    // 检测目录是否存在
    if(!file_exists($dirname)){
      mkdir($dirname,0777,true);
    }
    // 判断内容是否是数组或对象
    if(is_array($data)||is_object($data)){
      $data=serialize($data);
    }
    // 向文件写入内容
    if(file_put_contents($filename,$data) !==false){
      return true;
    }else{
      return false;
    }
  }



/**
 * [write_add_file 向文件追加内容]
 *
 * @param   string  $filename  [$filename 文件名]
 * @param   [type]  $data      [$data 数组或对象数据]
 *
 * @return  [type]             [return boolean]
 */
  function write_add_file(string $filename, $data){
    // 获取目录
    $dirname=dirname($filename);
    // 检测目录是否存在
    if(!file_exists($dirname)){
      mkdir($dirname,0777,true);
    }
    // 检查文件是否存在且可读
    if(is_file($filename)&&is_readable($filename)){
      // 读取文件内容
      if(filesize($filename)>0){
        $srcData=file_get_contents($filename);
      }
      
    }
    // 判断内容是否是数组或对象
    if(is_array($data)||is_object($data)){
      $data=serialize($data);
    }
    // 追加内容
    $data=$srcData.$data;
    // 向文件写入内容
    if(file_put_contents($filename,$data) !==false){
      return true;
    }else{
      return false;
    }
  }



  /**
   * [truncate_file 截取文件内容]
   *
   * @param   string  $filename  [$filename 文件名]
   * @param   int     $length    [$length 截取长度]
   *
   * @return  [type]             [return boolean]
   */
  function truncate_file(string $filename, int $length){
    // 检测是否是文件
    if(is_file($filename)&&is_writable($filename)){
      $handle=fopen($filename,'r+');
      $length =$length<0?0:$length;
      ftruncate($handle,$length);
      fclose($handle);
      return true;
    }
    return false;
  }



  /**
   * [down_file 下载文件]
   *
   * @param   string  $filename      [$filename 文件名]
   * @param   array   $allowDownExt  [$allowDownExt 文件类型]
   * @param   array                  [ description]
   * @param   jpg                    [ description]
   * @param   jpeg                   [ description]
   * @param   png                    [ description]
   * @param   rar                    [ description]
   * @param   zip                    [ description]
   * @param   html                   [ description]
   * @param   js                     [ description]
   *
   * @return  [type]                 [return boolean]
   */
   function down_file(string $filename, array $allowDownExt=array('jpg','jpeg','png','rar','zip','html','js')){
    // 检测下载文件是否存在及可读
    if(!is_file($filename)||!is_readable($filename)){
       return false;
     }
    //  检测文件类型是否允许下载
    $ext = strtolower(pathinfo($filename,PATHINFO_EXTENSION));
    if(!in_array($ext,$allowDownExt)){
      return false;
    }
    // 通过header()发送头部信息
    // 告诉浏览器输出的是字节流
    header('Content-Type:application/octet-stream');

    // 告诉浏览器返回的文件大小是按照字节进行计算的
    header('Accept-Ranges:bytes');

    // 告诉浏览器返回的文件大小
    header('Accept-Length:'.filesize($filename));

    // 告诉浏览器文件作为附件处理,告诉浏览器最终下载完的文件名称
    header('Content-Disposition:attachment;filename='.basename($filename));

    // 读取文件中的内容
    readfile($filename);
    exit;
   }
   /**
    * [down_frag_file 分片下载]
    *
    * @param   string  $filename      [$filename 文件名]
    * @param   array   $allowDownExt  [$allowDownExt 文件类型]
    * @param   array                  [ description]
    * @param   jpg                    [ description]
    * @param   jpeg                   [ description]
    * @param   png                    [ description]
    * @param   rar                    [ description]
    * @param   zip                    [ description]
    * @param   html                   [ description]
    * @param   js                     [ description]
    *
    * @return  [type]                 [return description]
    */
   function down_frag_file(string $filename, array $allowDownExt=array('jpg','jpeg','png','rar','zip','html','js')){
    // 检测下载文件是否存在及可读
    if(!is_file($filename)||!is_readable($filename)){
       return false;
     }
    //  检测文件类型是否允许下载
    $ext = strtolower(pathinfo($filename,PATHINFO_EXTENSION));
    if(!in_array($ext,$allowDownExt)){
      return false;
    }
    // 通过header()发送头部信息
    // 告诉浏览器输出的是字节流
    header('Content-Type:application/octet-stream');

    // 告诉浏览器返回的文件大小是按照字节进行计算的
    header('Accept-Ranges:bytes');
    $filesize =filesize($filename);
    // 告诉浏览器返回的文件大小
    header('Accept-Length:'.$filesize);

    // 告诉浏览器文件作为附件处理,告诉浏览器最终下载完的文件名称
    header('Content-Disposition: attachment;filename='.basename($filename));
 
    //规定每次读取文件的字节数为1024,直接输出数据
    $read_buffer=1024;
    $sum_buffer=0;
    $handle=fopen($filename,'rb');
    while(!feof($handle) && $sum_buffer<$filesize){
      echo fread($handle,$read_buffer);
      $sum_buffer+=$read_buffer;
    }
    fclose($handle);
    exit;
   }


/**
 * [upload_file 单文件上传]
 *
 * @param   array   $fileInfo    [$fileInfo 上传文件的信息(数组)]
 * @param   string  $uploadPath  [$uploadPath 文件上传默认路径]
 * @param   bool    $imageFlag   [$imageFlag 检测图片真实性]
 * @param   true                 [ description]
 * @param   array   $allowExt    [$allowExt 允许上传文件类型]
 * @param   jpeg                 [ description]
 * @param   jpg                  [ description]
 * @param   png                  [ description]
 * @param   gif                  [ description]
 * @param   int     $maxSize     [$maxSize 成功返回文件最终保存路径,失败返回false]
 *
 * @return  []                   [return description]
 */
   function upload_file(array $fileInfo,string $uploadPath='./uploads',bool $imageFlag=true,array $allowExt=['jpeg','jpg','png','gif'],int $maxSize=2097152){
     define('UPLOAD_ERRS',[
       'upload_max_filesize'=>'超过了PHP配置文件中upload_max_filesize选项的值',
       'form_max_size'=>'超过了表单MAX_FILE_SIZE选项的值',
       'upload_file_partial'=>'文件部分被上传',
       'no_upload_file_selecr'=>'没有选择上传文件',
       'upload_system_error'=>'系统错误',
       'no_allow_ext'=>"非法文件类型(仅能上传'jpeg','jpg','png','gif')",
       'exceed_max_size'=>'超出允许上传的最大值',
       'not_true_image'=>'文件不是真实图片',
       'not_http_post'=>'文件不是通过HTTP POST方式上传的',
       'move_error'=>'文件移动失败'
     ]);
    //  检测上传是否有错误
    if($fileInfo['error']===UPLOAD_ERR_OK){
        // 检测上传文件类型
        $ext = strtolower(pathinfo($fileInfo['name'],PATHINFO_EXTENSION));
        if(!in_array($ext,$allowExt)){
          echo UPLOAD_ERRS['no_allow_ext'];
          return false;
        }
        // 检测上传文件大小是否符合规范
        if($fileInfo['size']>$maxSize){
          echo UPLOAD_ERRS['exceed_max_size'];
          return false;
        }
        // 检测是否是真实图片
        if($imageFlag){
          if(@!getimagesize($fileInfo['tmp_name'])){
            echo UPLOAD_ERRS['not_true_image'];
            return false;
          }
        } 
        // 检测文件是否通过HTTP POST方式上传上来的
        if(!is_uploaded_file($fileInfo['tmp_name'])){
          echo UPLOAD_ERRS['not_http_post'];
          return false;
        }
        // 检测目标目录是否存在,不存在则创建
        if(!is_dir($uploadPath)){
          mkdir($uploadPath,0777,true);
        }
        // 生成唯一文件名,防止重名产生覆盖
        $uniName=md5(uniqid(microtime(true),true)).'.'.$ext;
        // $uniName='121212'.'.'.$ext;
        $dest=$uploadPath.DIRECTORY_SEPARATOR.$uniName;

        //移动文件
        if(@!move_uploaded_file($fileInfo['tmp_name'],$dest)){
          echo UPLOAD_ERRS['move_error'];
          return false;
        }
        echo '文件上传成功';
        return $dest;
    }else {
      switch($fileInfo['error']){
        case 1:
          $mes=UPLOAD_ERRS['upload_max_filesize'];
          break;
        case 2:
          $mes=UPLOAD_ERRS['form_max_size'];
          break;
        case 3:
          $mes=UPLOAD_ERRS['upload_file_partial'];
          break;
        case 4:
          $mes=UPLOAD_ERRS['no_upload_file_selecr'];
          break;
        case 5:
        case 6:
        case 7:
        case 8:
          $MES=UPLOAD_ERRS['upload_system_error'];
        break;
      }
      echo $mes;
      return false;
    }
   }
?>

下载的PHP代码:download.php

<?php
require_once 'file.func.php';
$filename=$_GET['filename'];
down_frag_file($filename); 
?>

下载的html代码:download.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>测试下载</title>
</head>
<body>
    <a href="download.php?filename=22.zip">下载13.zip</a>
</body>
</html>

上传的PHP代码:doUoload.php

<?php
require_once 'file.func.php';
$fileInfo=$_FILES['myFile'];
upload_file($fileInfo);
?>

上传的html代码:upload.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>上传文件</title>
</head>
<body>
    <form action="doUpload.php" method='post' enctype="multipart/form-data">
    <input type="file" name="myFile" id="">
    <input type="submit" value="立即上传">
</form>
</body>
</html>

以上代码实操完全正确!


标签: php
分享给朋友:

相关文章

 PHP入门基础之面向对象语法

PHP入门基础之面向对象语法

对象是程序中的一种数据结构,用来表现某个事物。相反,任何事物在程序中可以用某个对象来表示。对象包括变量和函数。对象中的变量叫做属性,对象中的函数叫做方法对象的属性和方法可以描述表达万事万物1、面向对象...

修改phpcms后台添加或编辑时的弹出新窗口

修改phpcms后台添加或编辑时的弹出新窗口

如题,在后台添加内容的时候每次都要弹出新的窗口,所以让内容发布人员极其不爽而我当然是要修改该问题,使新窗口打开不用弹出。找到phpcms\modules\content\templates\conte...

PHPCMS完成手机端搭建全教程(新手看完即会)

PHPCMS完成手机端搭建全教程(新手看完即会)

注:这篇文章是在我做完一个自适应和一个响应式网站后写的。所以我建议,如果可以的话,最好用@media css做响应式网站,这样就不用考虑手机端的各种问题。因为我当初做的就是自适应,但是没有想到后面的坑...

PHP入门之Linux基础和shell命令行

PHP入门之Linux基础和shell命令行

centos 一般支持10年nubuntu lts 一般支持5年一、linux系统环境搭建wmware 虚拟机下载centos  DVD ISO 或者EVerythine ISO 镜像&nb...

PHP入门之图像信息处理(验证码、水印、缩略图)

PHP入门之图像信息处理(验证码、水印、缩略图)

PHP处理图像信息要使用GD库(imageMagick是另外一种图像处理工具)1、gd_info:检测服务器支持的图像格式var_dump(gd_info()); // array(13)&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

分享:

支付宝

微信