index.php 壓縮包處理,上傳文件處理
<?php include('ziper.class.php'); /*接收base64的jpg圖片編碼,轉換爲圖片*/ try { $file = $_FILES['image']; // 判斷文件是否上傳 if (!is_uploaded_file($file['tmp_name'])){ throw new Exception("沒找到上傳的文件"); } // 上傳文件 $fileName = 'upload\\'.$file['name']; if (!move_uploaded_file($file['tmp_name'],$fileName)){ echo "文件已上傳,但是移動時出現錯誤"; } $usezip = new Ziper(); //$unzipDir = "./face/".date('YmdHis').mt_rand(); $unzipDir = './temp'; $unzipRes = $usezip->unzip($fileName, $unzipDir);//解壓file.zip到文件夾dir if($unzipRes!==true){ throw new Exception($unzipRes); } $dirPic = $unzipDir."/person/"; $imgList = getImgList($dirPic); if (empty($imgList)) { throw new Exception("圖片列表是空的"); } //移動文件到指定目錄 $result = moveBatch($imgList, 10); if($result['success']==$result['all']){ delDir($unzipDir); } $arr = [ 'code' => 200, 'data' => $result, 'msg' => 'success' ]; echo json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); } catch (Exception $ex) { $error_arr = [ 'code' => 400, 'data' => $ex->getMessage(), 'msg' => 'error' ]; echo json_encode($error_arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); }
工具類
<?php /** * **************************************************************** * 標題:Ziper類 * 作者:Gqleung * 郵箱:[email protected] * 博客:www.plasf.cn * * 描述:在PHP-ZipArchive類的基礎上進行二次封裝使得調用更加便捷 * zip方法:用於壓縮文件/文件夾 * contents_to_zip方法:該方法可以在Zip文件裏面寫入指定文件和內容 * unzip方法:解壓zip文件 * ************************************************************** */ class Ziper{ protected $ziper; protected $zipfilename; public function __construct(){ $this->ziper = new ZipArchive(); } /** * [zip description] * @param string $filename 新建壓縮文件的文件名,若不符合(*.zip)格式將自動添加zip後綴 * @param string $Fromfilename 被壓縮文件/文件夾的路徑 * @return string 若錯誤返回錯誤信息,若壓縮成功將返回 TRUE */ public function zip($filename='',$Fromfilename){ if (!empty($filename) && preg_match('/zip/m', $filename)){ if(!$this->ziper->open($filename, ZipArchive::CREATE)) return 'File open failed'; }elseif(!empty($filename)&& !preg_match('/zip/m', $filename)){ $filename = $filename.'zip'; if(!$this->ziper->open($filename, ZipArchive::CREATE)) return 'File open failed'; } if(is_dir($Fromfilename)){ $list_dir = scandir($Fromfilename); for($i=2;$i<count($list_dir);$i++){ if(is_dir($Fromfilename.'/'.$list_dir[$i])){ $this->ziper->addGlob($Fromfilename.'/'.$list_dir[$i].'/*.*', 0, array('add_path' => $Fromfilename.'/'.$list_dir[$i].'/', 'remove_path' => $Fromfilename.'/'.$list_dir[$i])); $list_chr = scandir($Fromfilename.'/'.$list_dir[$i]); for($j=2;$j<count($list_chr);$j++){ if(is_dir($Fromfilename.'/'.$list_dir[$i].'/'.$list_chr[$j])){ echo $list_chr[$j]; $this->zip('',$Fromfilename.'/'.$list_dir[$i].'/'.$list_chr[$j]); } } } } }else{ $this->ziper->addFile ($Fromfilename); } return TRUE; } /** * [contents_to_zip description] * @param string $filename 壓縮文件名 * @param string $zipfilename 需要向壓縮文件寫入的文件名 * @param string $content 寫入文件的內容 * @return string 成功返回True,否則返回錯誤內容 */ public function contents_to_zip($filename,$zipfilename,$content){ if(!$this->ziper->open($filename, ZipArchive::CREATE)) return 'File open failed'; if(!$this->ziper->addFromString ($zipfilename, $content)) return 'File write failed'; return TRUE; } /** * [unzip description] * @param string $filename 被壓縮文件路徑名 * @param string $dir 解壓縮所到目錄 * @return string 返回錯誤原因 */ public function unzip($filename,$dir){ if(!file_exists($filename)) return 'File does not exist'; if(!$this->ziper->open($filename)) return 'File open failed'; if(!is_dir($dir)){ mkdir($dir,0775,true); } if(!$this->ziper->extractTo($dir)) return 'File unzip failed'; return TRUE; } public function __destruct() { $this->ziper->close(); } } //驗證是否是圖片 function isImage($filepath) { $imgType = array('png', 'jpg', 'jpeg'); list($filename, $kzm) = explode('.', $filepath); //獲取擴展名 if (in_array($kzm, $imgType)) { return true; } } //獲取圖片文件列表函數 function getImgList($dir) { $files = array(); if (is_dir($dir)) { $file_dir = scandir($dir); foreach ($file_dir as $file) { if ($file == '.' || $file == '..') { continue; } elseif (is_dir($dir . $file . '/')) { $files = array_merge($files, getImgList($dir . $file . '/')); } else { if (isImage($dir . $file) !== false) { array_push($files, $dir . $file); } } } } return $files; } //移動文件 function moveBatch($pictureList, $addressId) { $typePath = 'face'; $str_fileDir = sprintf("%s/%s/%s", $typePath, $addressId, date('Ymd')); if (!is_dir($str_fileDir)) { mkdir($str_fileDir, 0755, true); } $success = 0; $fail = 0; $all = count($pictureList); foreach ($pictureList as $key => $value) { $temp = explode("/", $value); $filename = array_pop($temp); $copyRes = copy($value, $str_fileDir . '/' . $filename); if ($copyRes === false) { $fail++; } else { unlink($value); $success++; } } return ['success' => $success, 'fail' => $fail, 'all' => $all]; } //function deleteDir($dir){ // if(is_dir($dir)){ // if($dp=opendir($dir)){ // while (($file = readdir($dp))!=false){ // // if($file=='.'||$file=='..'){ // echo $file.PHP_EOL; // continue; // } // $subFile=$dir."/".$file;//將目錄下的文件與當前目錄相連 // if(is_readable($subFile)&&count(scandir($subFile))==2){ // echo $subFile.'111'; // rmdir($subFile); // } // if(is_dir($subFile)){ // echo $subFile.'222'; // deleteDir($subFile); // } // if(is_file($subFile)){ // echo $subFile.'333'; // unlink($subFile); // } // } // closedir($dp); // }else{ // exit("not permission"); // } // }else{ // exit("not dir"); // } //} function delDir($directory){//自定義函數遞歸的函數整個目錄 if(file_exists($directory)){//判斷目錄是否存在,如果不存在rmdir()函數會出錯 if($dir_handle=@opendir($directory)){//打開目錄返回目錄資源,並判斷是否成功 while($filename=readdir($dir_handle)){//遍歷目錄,讀出目錄中的文件或文件夾 if($filename!='.' && $filename!='..'){//一定要排除兩個特殊的目錄 $subFile=$directory."/".$filename;//將目錄下的文件與當前目錄相連 if(is_dir($subFile)){//如果是目錄條件則成了 delDir($subFile);//遞歸調用自己刪除子目錄 } if(is_file($subFile)){//如果是文件條件則成立 unlink($subFile);//直接刪除這個文件 } } } closedir($dir_handle);//關閉目錄資源 rmdir($directory);//刪除空目錄 } } } ?>
index.html
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>文件上傳</title> </head> <body> <!-- form表單文件上傳時,必須使用 enctype 屬性爲 multipart/form-data --> <form action="index.php" method="POST" enctype="multipart/form-data"> <input type="file" name="image"> <p></p> <input type="submit" name="上傳文件"> </form> </body> </html>