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
单文件上传

多文件上传

原文地址:https://www.cnblogs.com/swm8023/p/3261932.html