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