php 上傳文件壓縮包

 

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>

 





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章