PHP 使用 ZipArchive 解壓避免亂碼

TOPHP發表於2024-05-31
$filePath: 壓縮包路徑  ../123.zip
$path:要解壓的目錄 ../unzip/

public function newUnzip($filePath,$path)
    {
        $zip= new \ZipArchive();
        if($zip->open($filePath) === true) {
            // 建立要解壓的目錄
            // 獲取解壓的檔案陣列
            $fileNum = $zip->numFiles;
            for ($i = 0; $i < $fileNum; $i++) {
                // 處理每一個檔案
                $statInfo = $zip->statIndex($i, 64);
                // 獲取檔案的名稱的編碼格式
                $info = explode('/', $statInfo['name']);
                foreach ($info as $key => $val) {
                    $encoding = mb_detect_encoding($val, ['UTF-8', 'GBK', 'BIG5', 'CP936']);
                    $info[$key] = iconv($encoding, 'UTF-8//IGNORE', $val);
                }
                $statInfo['name'] = implode('/', $info);
                mkdir($path, 0777, true);
                if (strpos($statInfo['name'], '/') !== false) {
                    $mkdFile = explode('/', $statInfo['name']);
                    if (count($mkdFile) == 1) {
                        $namePath = $mkdFile[0];
                    } else {
                        $namePath = $mkdFile[count($mkdFile) - 1];
                    }
                    //獲取zip單個檔案資料
                    $fp = fopen('zip://' . $filePath . '#' . $zip->getNameIndex($i), 'rb');
                    $create = true;
                    while (!feof($fp)) {
                        //fread 獲取檔案資料流 儲存到本地
                        file_put_contents($path . DIRECTORY_SEPARATOR . $namePath, fread($fp, 9999999),$create ? 0 : FILE_APPEND);
                        $create = false;
                    }
                } else {
                    if (!copy('zip://' . $filePath . '#' . $zip->getNameIndex($i), $path . '/' . $statInfo['name'])) {
                        return false;
                    }
                }
            }
        }
        $zip->close();
    }
  

  

相關文章