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將在讀取到\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)."<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>
downloadphp
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
單文件上傳函數
多文件上傳post