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)?"存在":"不存在")."
"; 12 echo "filetype:".filetype($filename)."
"; 13 echo "filesize:".filesize($filename)."
"; 14 echo "readable:";var_dump(is_readable($filename)); echo "
"; 15 echo "writeable:";var_dump(is_writeable($filename)); echo "
"; 16 echo "executeable:";var_dump(is_executable($filename)); echo "
"; 17 18 echo "ctime:".date("Y-m-j", filectime($filename))."
"; 19 echo "mtime:".date("Y-m-j", filemtime($filename))."
"; 20 echo "atime:".date("Y-m-j", fileatime($filename))."
"; 21 22 print_r(stat($filename)); 23 echo "

"; 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)."
"; 41 echo "dirname:".dirname($filename)."
"; 42 print_r(pathinfo($filename)); echo "
"; 43 44 $nowdir = opendir("."); 45 echo "当前目录下的文件有:
"; 46 while (@ $filename = readdir($nowdir)) { 47 echo filetype($filename)."->".$filename."
"; 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

"; 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将在读取到\n,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."\r\n"); 87 } 88 fclose($file_handle); 89 //各种方式读取文件 90 $file_handle = fopen($filename, "r"); 91 echo fread($file_handle, 13)."
"; 92 echo fgets($file_handle)."
"; 93 echo fgetc($file_handle)."
"; 94 echo file_get_contents($filename)."
"; 95 print_r(file($filename)); echo "
"; 96 echo readfile($filename); //这样会先输出file的内容,再输出file的长度 97 fclose($file_handle); 98 echo "

"; 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)."
"; 108 echo fgetc($file_handle)."
"; 109 echo ftell($file_handle)."
"; 110 fseek($file_handle, 10, SEEK_CUR); 111 echo ftell($file_handle)."
"; 112 rewind($file_handle); 113 echo ftell($file_handle)."
"; 114 fclose($file_handle); 115 echo "
"; 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."

"; 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 *
143 * 144 * 145 *
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 文件下载
176 img/1.jpg
177
单文件上传
178
179 180 181 182
183
多文件上传
184
185 186
187
188
189 190


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

你可能感兴趣的:(PHP学习笔记11——文件处理)