• PHP学习笔记11——文件处理


      1 <?php
      2     //1. 获取文件(目录)属性
      3         /* filetype                                 文件属性
      4          * file_exists                                文件是否存在
      5          * is_readable,is_writeable,is_executable    文件可读/写/执行
      6          * filectime,filemtime,fileatime            文件创建时间/修改时间/访问时间
      7          * stat                                        文件大部分属性值
      8          * ...
      9          */
     10     $filename = "file/01.php";
     11     echo $filename.(file_exists($filename)?"存在":"不存在")."<br/>";
     12     echo "filetype:".filetype($filename)."<br/>";
     13     echo "filesize:".filesize($filename)."<br/>";
     14     echo "readable:";var_dump(is_readable($filename)); echo "<br/>";
     15     echo "writeable:";var_dump(is_writeable($filename)); echo "<br/>";
     16     echo "executeable:";var_dump(is_executable($filename)); echo "<br/>";
     17     
     18     echo "ctime:".date("Y-m-j", filectime($filename))."<br/>";
     19     echo "mtime:".date("Y-m-j", filemtime($filename))."<br/>";
     20     echo "atime:".date("Y-m-j", fileatime($filename))."<br/>";
     21     
     22     print_r(stat($filename));
     23     echo "<br/><br/>";
     24     
     25     //2. 目录基本操作
     26         /* basename            返回文件名部分,第二个参数suffix可选,如果提供了就不会输出这个扩展名
     27          * dirname            去掉文件部分的目录
     28          * pathinfo            返回关联数组,包含文件名、扩展名和目录
     29          * opendir            打开一个目录
     30          * readdir            接收用opendir打开的句柄,返回第一个文件名并将指针后移一位,直到返回false
     31          * closedir            关闭用opendir打开的句柄
     32          * rewinddir        重置句柄指针到开头
     33          * 目录的创建与删除
     34          * mkdir创建目录,rmdir删除目录,但删除非空目录需要先递归删除子目录,使用unlink删除文件
     35          * 复制目录
     36          * 也需要使用mkdir和copy命令递归操作
     37          * 统计目录大小
     38          * 也需要使用递归来实现,下面会实现该功能
     39          */
     40     echo "basename:".basename($filename)."<br/>";
     41     echo "dirname:".dirname($filename)."<br/>";
     42     print_r(pathinfo($filename)); echo "<br/>";
     43     
     44     $nowdir = opendir(".");
     45     echo "当前目录下的文件有:<br/>";
     46     while (@ $filename = readdir($nowdir)) {
     47         echo filetype($filename)."->".$filename."<br/>";
     48     }
     49     
     50     function dirszie($dirname){
     51         $dir_size = 0;
     52         $dir_handle = opendir($dirname);
     53         while (@ $filename = readdir($dir_handle)) {
     54             if ($filename == "." || $filename == "..") continue;
     55             $filename = $dirname.DIRECTORY_SEPARATOR.$filename;
     56             if (is_dir($filename)) {
     57                 $dir_size += dirszie($filename);
     58             } else if (is_file($filename)) {
     59                 $dir_size += filesize($filename);
     60             }
     61         }
     62         closedir($dir_handle);
     63         return $dir_size;
     64     }
     65     echo "当前目录大小:".round(dirszie(".")/1024,2)."KB<br/><br/>";
     66 
     67     //3. 文件的基本操作
     68         /* 文件读写操作
     69          * fopen($filename,$mode,[$use_include_path,[$zcontext]]打开文件资源
     70          * filename也可以是远程文件,是http或者ftp等url
     71          * 第二个参数为打开模式,有rwax+bt等组合(r读w写ax创建追加b二进制t文本,其中ax的区别是x如果文件存在会返回false)
     72          * 第三个参数表示是否使用配置文件中德include_path来搜索文件,第四个参数是用来支持一些协议的
     73          * fclose()                                关闭文件资源
     74          * fwrite($handle,$string,[$len])        写入文件,返回写入的字符数
     75          * fread($handle,$len)                    读取字符串
     76          * file_get_contents($filename)            将文件转换成字符串
     77          * fgets($hanlde,[$len]),fgetc($handle) 一次读取一行或者一个字符,默认len是1024,fgets将在读取到
    ,eof或者len-1个字符后结束
     78          * file($filename)                        读取一个文件到数组中,每个元素对应每行
     79          * readfile($filename)                    直接输出文件到输出缓冲区,并返回字符书
     80          */
     81     $filename = "file/file0.txt";
     82         //写入文件
     83     $file_handle = fopen($filename, "w");
     84     for ($i = 0; $i < 5; $i++) {
     85         $string = str_repeat($i, 10);
     86         fwrite($file_handle, $string."
    ");
     87     }
     88     fclose($file_handle);
     89         //各种方式读取文件
     90     $file_handle = fopen($filename, "r");
     91     echo fread($file_handle, 13)."<br/>";
     92     echo fgets($file_handle)."<br/>";
     93     echo fgetc($file_handle)."<br/>";
     94     echo file_get_contents($filename)."<br/>";
     95     print_r(file($filename)); echo "<br/>";
     96     echo readfile($filename);        //这样会先输出file的内容,再输出file的长度
     97     fclose($file_handle);
     98     echo "<br/><br/>";
     99     
    100         /* 移动文件指针
    101          * ftell($handle),rewind($handle),fseek($handle,$offset,[$whence])
    102          * 分别是告诉文件指针位置,文件指针回到头部和移动指针
    103          * fseek中,whence可以选择SEEK_CUR(now+offset),SEEK_END(end+offset(负数)),SEEK_SET(默认,0+offset)
    104          */
    105     $file_handle = fopen($filename, "r");
    106     fseek($file_handle, 5);
    107     echo ftell($file_handle)."<br/>";
    108     echo fgetc($file_handle)."<br/>";
    109     echo ftell($file_handle)."<br/>";
    110     fseek($file_handle, 10, SEEK_CUR);
    111     echo ftell($file_handle)."<br/>";
    112     rewind($file_handle);
    113     echo ftell($file_handle)."<br/>";
    114     fclose($file_handle);
    115     echo "<br/>";
    116     
    117         /* 文件的一些基本操作
    118          * copy($src_file, $dst_file)    复制文件
    119          * unlink($file);                删除文件
    120          * ftruncate($file_handle,$len)        截断文件
    121          * rename($old_file, $new_file)    重命名文件
    122          */
    123     copy($filename, "file/file1.txt");
    124     copy("file/file1.txt", "file/file2.txt");
    125     unlink("file/file1.txt");
    126     $file_handle = fopen("file/file2.txt", "r+");
    127     ftruncate($file_handle, 30);
    128     fclose($file_handle);
    129     rename("file/file2.txt", "file/re_file2.txt");
    130     $len = readfile("file/re_file2.txt");
    131     echo " ".$len."<br/><br/>";
    132     
    133         /* 锁定文件
    134           * flock($handle,$oper[,$wouldblock])
    135           * oper有LOCK_SH(取得共享锁,读),LOCK_EX(取得独占锁,写),LOCK_UN(释放锁定),LOCK_NB(附加锁定,如果不希望阻塞,加上该锁)
    136           * 就是读写锁,不再赘述
    137           */
    138      
    139     //4. 文件的上传与下载
    140         /* 上传
    141          * 客户端HTML提交 
    142          * <form enctype="multipart/form-data" method="post">
    143          *     <input type="file" name="myfile"/>
    144          *  <input type="hidden" name="MAX_FILE_SIZE" value="1000000"/>
    145          * </form>
    146          * 服务端PHP处理
    147          *     php.ini中相关处理选项及默认值
    148          *         file_uploads        on        是否可接受文件上传
    149          *         upload_max_filesize    2M        上传文件最大值
    150          *         post_max_size        8M        POST请求最大值
    151          *         upload_tmp_dir        NULL    临时存放上传文件的路径,默认为操作系统的tmp位置
    152          *  全局数组$_FILES,是一个关联二维数组,用来取出上传文件的相关信息,用input标签中的name属性来取出对应数组,包含以下字段
    153          *      $_FILES["myfile"]["name"]        原文件名
    154          *      $_FILES["myfile"]["size"]        已上传文件大小
    155          *      $_FILES["myfile"]["tmp_name"]    临时文件名
    156          *      $_FILES["myfile"]["error"]        错误信息(0=>成功,1=>超限制大小,2=>超出表单中的MAX_FILE_SIZE,4=>部分上传,5=>无上传文件)
    157          *      $_FILES["myfile"]["type"]        MIME类型,如image/gif等
    158          *  PHP中处理文件上传的函数
    159          *      is_upload_file($filename)            判断文件是否通过HTTP POST上传
    160          *      move_upload_file($filename,$dest)    使用该函数将临时文件移动到指定位置,该函数确
    161          *  保filename是上传的文件
    162          */
    163     
    164         /* 下载
    165          * 通过a标签的href属性可以直接下载文件,但是对于浏览器能识别的MIME类型 会直接打开
    166          * 通过三个header函数,和输出文件内容让浏览器使用下载
    167          * 注意在一个php文件中,只能由这些内容,将这个php文件作为专门的下载链接只能使用一次,因为每个php文件的header只能发送一次
    168          *     header('Content-Type: image/jpeg');
    169          *     header('Content-Disposition: attachment; filename="1.jpg"');
    170          *     header('Content-Length: '.filesize($filename));
    171          *     readfile($filename);
    172          */
    173 
    174 ?>
    175 文件下载<br/>
    176 <a href= "11download.php?filename=img%2F1.jpg">img/1.jpg</a><br/>
    177 <br/>单文件上传<br/>
    178 <form action ="11upload.php" method="post" enctype="multipart/form-data">
    179     <input type="hidden" name="MAX_FILE_SIZE" value="1000000">
    180     <input type="file" name="myfile">
    181     <input type="submit" value="上传文件">
    182 </form>
    183 <br/>多文件上传<br/>
    184 <form action ="11upload.php" method="post" enctype="multipart/form-data">
    185     <input type="hidden" name="MAX_FILE_SIZE" value="1000000">
    186     <input type="file" name="myfile[]"><br/>
    187     <input type="file" name="myfile[]"><br/>
    188     <input type="file" name="myfile[]"><br/>
    189     <input type="submit" value="上传文件">
    190 </form>


    download

    1 <?php
    2     //下载一个JPG图片
    3     $filename = $_GET["filename"];
    4     header('Content-Type: image/jpeg');
    5     header('Content-Disposition: attachment; filename="'.$filename.'"');
    6     header('Content-Length: '.filesize($filename));
    7     readfile($filename);    
    8 ?>


    upload

      1 <?php
      2 
      3     $upload = new fileUpload;
      4     $upload->set("path", "./uppath")
      5                ->set("size", "1000000")
      6             ->set("allowtype", array("gif", "jpg", "png"))
      7             ->set("israndname", false);
      8     if ($upload->upload("myfile")) {
      9         print_r($upload->getFileName());
     10     } else {
     11         print_r($upload->getErrorMsg());
     12     }
     13     
     14     
     15     class fileUpload{
     16         private $path = "./uploads";
     17         private $allowtype = array("jpg", "gif", "png");
     18         private $maxsize = 1000000;
     19         private $israndname = true;
     20         
     21         private $originFilename;    //源文件名
     22         private $tmpFilename;        //临时文件名
     23         private $newFilename;        //新文件名
     24         private $fileType;
     25         private $fileSize;
     26         
     27         private $errorNum = 0;
     28         private $errorMes = "";
     29         
     30         //连贯操作,用于配置文件上传类的参数
     31         public function set($key, $value) {
     32             $key = strtolower($key);
     33             if (array_key_exists($key, get_class_vars(get_class($this)))) {
     34                 $this->setOption($key, $value);
     35             }
     36             return $this;
     37         }
     38         //文件上传
     39         public function upload($fileField) {
     40             $ret = true;
     41             //判断路径合法
     42             if (!$this->checkFieldPath()) {
     43                 $this->errorMes = $this->getError();
     44                 return false;
     45             }
     46             //拿到上传属性
     47             $name = $_FILES[$fileField]['name'];
     48             $tmp_name = $_FILES[$fileField]['tmp_name'];
     49             $size = $_FILES[$fileField]['size'];
     50             $error = $_FILES[$fileField]['error'];
     51             //多文件上传处理
     52             if (is_array($name)) {
     53                 //先全部进行检查
     54                 $errors = array();
     55                 for ($i = 0; $i < count($name); $i++) {
     56                     if (!$this->setFiles($name[$i],$tmp_name[$i],$size[$i],$error[$i]) ||
     57                         !$this->checkFilesize() || !$this->checkFiletype()) {
     58                             $errors[] = $this->getError();
     59                             $ret = false;
     60                     }    
     61                     //有错误时重新初始化
     62                     if (!$ret) $this->setFiles(); 
     63                 }
     64                 //没错误时才全部上传
     65                 if ($ret) {
     66                     $filenames = array();
     67                     for ($i = 0; $i < count($name); $i++) {
     68                         if ($this->setFiles($name[$i],$tmp_name[$i],$size[$i],$error[$i])) {
     69                             $this->setNewFilename();
     70                             if (!$this->copyFile()) {
     71                                 $errors[] = $this->newFilename;
     72                                 $ret = false;
     73                             }
     74                             $filenames[] = $this->newFilename;
     75                         }
     76                     }
     77                     $this->newFilename = $filenames;
     78                 }
     79                 $this->errorMes = $errors;
     80             //单文件上传处理
     81             } else {
     82                 if (!$this->setFiles($name,$tmp_name,$size,$error) ||
     83                     !$this->checkFilesize() || !$this->checkFiletype()) {
     84                     $ret = false;
     85                 } else {
     86                     $this->setNewFilename();
     87                     $ret = $this->copyFile();
     88                 }
     89                 if (!$ret)
     90                     $this->errorMes = $this->getError();
     91             }
     92             return $ret;
     93         }
     94         //获取错误信息和文件名
     95         public function getErrorMsg(){
     96             return $this->errorMes;
     97         }
     98         public function getFileName(){
     99             return $this->newFilename;
    100         }
    101         
    102         //设置_FILES的相关内容
    103         private function setFiles($name="", $tmp_name="", $size=0, $error=0) {
    104             $this->setOption("errorNum", $error);
    105             if ($error) return;
    106             $this->setOption("originFilename", $name);
    107             $this->setOption("tmpFilename", $tmp_name);
    108             $aryStr = explode(".", $name);
    109             $this->setOption("fileType", strtolower($aryStr[count($aryStr)-1]));
    110             $this->setOption("fileSize", $size);
    111             return true;
    112         }
    113         
    114         //将错误码翻译成错误信息
    115         private function getError(){
    116             //错误码翻译,这里简单处理了
    117             return "上传文件出错".$this->errorNum;
    118         }
    119         
    120         //设置类的参数
    121         private function setOption($key, $value) {
    122             $this->$key = $value;
    123         }
    124         //设置文件名称等参数
    125         private function setNewFilename(){
    126             if ($this->israndname) 
    127                 $this->setOption("newFilename", $this->proRandname());
    128             else 
    129                 $this->setOption("newFilename", $this->originFilename);
    130         }
    131         
    132         //检查是上传路径是否配置,是否存在上传文件的目录,没有则创建
    133         private function checkFieldPath(){
    134             if (empty($this->path)){
    135                 $this->setOption("errorNum", -5);
    136                 return false;
    137             }
    138             if (!file_exists($this->path) || !is_writeable($this->path)) {
    139                 if (!mkdir($this->path, 0755)) {
    140                     $this->setOption("errorNum", -4);
    141                     return false;
    142                 }
    143             }
    144             return true;
    145         }
    146         //检查文件类型是否合法
    147         private function checkFiletype(){
    148             if (in_array(strtolower($this->fileType), $this->allowtype)) {
    149                 return true;
    150             } else {
    151                 $this->setOption("errorNum", -1);
    152                 return false;
    153             }                
    154         }
    155         //坚持文件大小是否合法
    156         private function checkFilesize(){
    157             if ($this->fileSize > $this->maxsize) {
    158                 $this->setOption("errorNum", -2);
    159                 return false;
    160             } else {
    161                 return true;
    162             }
    163         }
    164         
    165         //设置随机文件名
    166         private function proRandname(){
    167             $filename = date('YmdHis')."_".rand(100,999);
    168             return $filename.".".$this->fileType;
    169         }
    170         //复制上传文件到指定位置
    171         private function copyFile(){
    172             if (!$this->errorNum) {
    173                 $path = rtrim($this->path, "/")."/";
    174                 $path .= $this->newFilename;
    175                 if (move_uploaded_file($this->tmpFilename, $path)) { 
    176                     return true;
    177                 } else {
    178                     $this->setOption("errorNum", -3);
    179                     return false;
    180                 }
    181             }else {
    182                 return false;
    183             }
    184         }
    185     }
    186 ?>

    执行结果

    file/01.php存在
    filetype:file
    filesize:5638
    readable:bool(true) 
    writeable:bool(true) 
    executeable:bool(false) 
    ctime:2013-08-9
    mtime:2013-07-21
    atime:2013-08-9
    Array ( [0] => 3 [1] => 0 [2] => 33206 [3] => 1 [4] => 0 [5] => 0 [6] => 3 [7] => 5638 [8] => 1376019633 [9] => 1374394668 [10] => 1376019633 [11] => -1 [12] => -1 [dev] => 3 [ino] => 0 [mode] => 33206 [nlink] => 1 [uid] => 0 [gid] => 0 [rdev] => 3 [size] => 5638 [atime] => 1376019633 [mtime] => 1374394668 [ctime] => 1376019633 [blksize] => -1 [blocks] => -1 ) 
    
    basename:01.php
    dirname:file
    Array ( [dirname] => file [basename] => 01.php [extension] => php [filename] => 01 ) 
    当前目录下的文件有:
    dir->.
    dir->..
    file->.buildpath
    file->.project
    dir->.settings
    file->01.php
    file->02.php
    file->03.php
    file->04.php
    file->05.php
    dir->06
    file->07.php
    file->08.php
    dir->09
    file->10.php
    file->11.php
    file->11download.php
    file->11upload.php
    file->12.php
    dir->file
    dir->img
    file->msyh.ttc
    dir->uppath
    当前目录大小:21928.83KB
    
    0000000000 1
    111111111 
    2
    0000000000 1111111111 2222222222 3333333333 4444444444 
    Array ( [0] => 0000000000 [1] => 1111111111 [2] => 2222222222 [3] => 3333333333 [4] => 4444444444 ) 
    0000000000 1111111111 2222222222 3333333333 4444444444 60
    
    5
    0
    6
    16
    0
    
    0000000000 1111111111 222222 30

    文件下载 img/1.jpg
    单文件上传

    多文件上传

  • 相关阅读:
    [zt]在XML序列化时去除默认命名空间xmlns:xsd和xmlns:xsi
    线程间操作无效: 从不是创建控件“...”的线程访问它。
    Unity IoC + WCF + wsHTTPBinding + Certificate Authorization
    [转]PowerDesigner使用教程 —— 概念数据模型
    C# Post数据和接收简单示例【摘】
    163相册验证码图片的识别手记之一 去除干扰
    实现WCF和Unity 的集成
    Html.ActionLink 几种重载方式说明及例子
    如何从程序员到项目经理【转帖51cto】
    OSG闪存
  • 原文地址:https://www.cnblogs.com/swm8023/p/3261932.html
Copyright © 2020-2023  润新知