zoukankan      html  css  js  c++  java
  • 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
    单文件上传

    多文件上传

  • 相关阅读:
    SQLMAP注入教程-11种常见SQLMAP使用方法详解
    VS2012/2013/2015/Visual Studio 2017 关闭单击文件进行预览的功能
    解决 IIS 反向代理ARR URLREWRITE 设置后,不能跨域跳转 return Redirect 问题
    Spring Data JPA one to one 共享主键关联
    JHipster 问题集中
    Spring Data JPA 定义超类
    Spring Data JPA查询关联数据
    maven命名
    maven仓库
    Jackson读取列表
  • 原文地址:https://www.cnblogs.com/swm8023/p/3261932.html
Copyright © 2011-2022 走看看