红穆笔记
首頁 語言筆記 PHP遠程下載zip並解壓覆蓋指定目錄,如果指定目錄不存在,那麼便創建目錄,如果目錄存在則清空目錄,解壓的zip文件中,含有中文名的文件
語言筆記 PHP

PHP遠程下載zip並解壓覆蓋指定目錄,如果指定目錄不存在,那麼便創建目錄,如果目錄存在則清空目錄,解壓的zip文件中,含有中文名的文件

PHP远程下载zip并解压覆盖指定目录,如果指定目录不存在,那么便创建目录,如果目录存在则清空目录,解压的zip文件中,含有中文名的文件

PHP遠程下載zip並解壓覆蓋指定目錄,如果指定目錄不存在,那麼便創建目錄,如果目錄存在則清空目錄,解壓的zip文件中,含有中文名的文件!

之前我寫了一篇文章《PHP遠程下載zip並解壓覆蓋指定目錄》,可以參考一下,但是後來使用之後發現一個問題!

代碼問題

那就是,如果對象目錄不存在,那麼就會報錯!

解壓的過程中,因爲壓縮文件有中文名,所以解壓也出現了錯誤!

當然,我們完全可以將錯誤直接用@符號來將第一個錯誤屏蔽的,但是我想了想,還是覺得改一下!

問題反思

這次來完善一下,可以參考這篇文章《PHP解壓壓縮包,裏面含有中文名壓縮包,爲什麼解壓後會出現錯誤

這裏就兩則結合,然後將代碼函數優化一下!

代碼實現

下面是一個示例代碼,可以實現遠程下載zip並解壓覆蓋指定目錄,如果指定目錄不存在,那麼便創建目錄,如果目錄存在則清空目錄,解壓的zip文件中,含有中文名的文件:

$remoteZipUrl = 'https://example.com/remote.zip'; // 遠程zip文件的URL
$localDir = '/path/to/local/dir'; // 本地目錄的路徑

// 如果本地目錄不存在,創建目錄
if (!file_exists($localDir)) {
  mkdir($localDir, 0777, true);
}

// 如果本地目錄存在,清空目錄
if (file_exists($localDir) && is_dir($localDir)) {
  $files = glob($localDir . '/*'); // 獲取目錄下的所有文件
  foreach ($files as $file) {
    if (is_file($file)) {
      unlink($file); // 刪除文件
    }
  }
}

// 下載zip文件到本地臨時文件
$tempFile = tempnam(sys_get_temp_dir(), 'zip');
$fp = fopen($tempFile, 'w');
$ch = curl_init($remoteZipUrl);
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_exec($ch);
curl_close($ch);
fclose($fp);

// 解壓zip文件到本地目錄
$zip = new ZipArchive;
$res = $zip->open($tempFile);
if ($res === TRUE) {
  $zip->setOptions(array('default_charset' => 'UTF-8')); // 設置文件名編碼方式爲 UTF-8
  $zip->extractTo($localDir); // 解壓縮到指定目錄
  $zip->close();
  echo '解壓縮完成';
} else {
  echo '解壓縮失敗';
}

// 刪除本地臨時文件
unlink($tempFile);

在這個示例中,首先檢查本地目錄是否存在,如果不存在則使用 mkdir() 函數創建目錄,如果存在則使用 glob()unlink() 函數清空目錄。

然後,使用 tempnam() 函數創建一個臨時文件用於下載遠程zip文件。使用 curl 函數從遠程URL下載zip文件到本地臨時文件。

接下來,使用 ZipArchive 類打開本地臨時文件,並設置文件名編碼方式爲 UTF-8。最後,調用 extractTo() 方法將zip文件解壓縮到指定目錄。解壓縮完成後,刪除本地臨時文件。

注意:在使用此代碼之前,需要確保服務器上已經安裝了 ZipArchive 擴展和 curl 擴展。

函數封裝

🔒 隱藏內容:登錄後可查看

function downloadAndExtractZip($remoteZipUrl, $localDir) {
  // 如果本地目錄不存在,創建目錄
  if (!file_exists($localDir)) {
    mkdir($localDir, 0777, true);
  }

  // 如果本地目錄存在,清空目錄
  if (file_exists($localDir) && is_dir($localDir)) {
    $files = glob($localDir . '/*'); // 獲取目錄下的所有文件
    foreach ($files as $file) {
      if (is_file($file)) {
        unlink($file); // 刪除文件
      }
    }
  }

  // 下載zip文件到本地臨時文件
  $tempFile = tempnam(sys_get_temp_dir(), 'zip');
  $fp = fopen($tempFile, 'w');
  $ch = curl_init($remoteZipUrl);
  curl_setopt($ch, CURLOPT_FILE, $fp);
  curl_exec($ch);
  curl_close($ch);
  fclose($fp);

  // 解壓zip文件到本地目錄
  $zip = new ZipArchive;
  $res = $zip->open($tempFile);
  if ($res === TRUE) {
    $zip->setOptions(array('default_charset' => 'UTF-8')); // 設置文件名編碼方式爲 UTF-8
    $zip->extractTo($localDir); // 解壓縮到指定目錄
    $zip->close();
    unlink($tempFile); // 刪除本地臨時文件
    return true;
  } else {
    unlink($tempFile); // 刪除本地臨時文件
    return false;
  }
}

這個函數的參數是遠程zip文件的URL和本地目錄的路徑。它將檢查本地目錄是否存在,如果不存在則使用 mkdir() 函數創建目錄,如果存在則使用 glob()unlink() 函數清空目錄。

然後,使用 tempnam() 函數創建一個臨時文件用於下載遠程zip文件。使用 curl 函數從遠程URL下載zip文件到本地臨時文件。

接下來,使用 ZipArchive 類打開本地臨時文件,並設置文件名編碼方式爲 UTF-8。最後,調用 extractTo() 方法將zip文件解壓縮到指定目錄。解壓縮完成後,刪除本地臨時文件。

如果解壓縮成功,該函數將返回 true,否則返回 false

報錯問題:

運行函數後報錯了!!!

如果出現報錯,請閱讀我的這三篇文章!!

Fatal error: Call to undefined method ZipArchive::setOptions() 的解決辦法!

如何查看自己的PHP是否安裝ZipArchive?

Fatal error: Call to undefined method ZipArchive::setOptions() in /www/wwwroot/test.4s5.cn/1.php on line 37

最終方案

如果實現無法解決ZipArchive擴展問題,那麼可以閱讀這篇文章!

PclZip替代ZipArchive,解決PHP報錯問題!

當然,如果你服務器支持ZipArchive,並且上面的函數代碼使用正常,那麼可以不用查閱。

 
微信赞赏

微信

支付宝赞赏

支付寶

✍️ 作者: 紅穆

網站管理員 · 感謝閱讀,更多精彩內容敬請關注

作者主頁 查看主頁 →

相關文章

PHP ob函数记录

PHP ob函數記錄 語言筆記 PHP

下面3個函數的用法 ob_get_contents(); ob_end_clean(); ob_start(); 可以藉助這幾個函數實現緩衝本地文件,以及執行本地腳本代碼。 使用ob_start()把輸出的代碼存到緩衝區,頁面不會顯示出來; 然後用ob_get_contents得到緩衝區的數據。 o…
👁 141
PHP preg

PHP preg 語言筆記 PHP

preg_match_all 函數用於執行一個全局正則表達式匹配。preg_match_all() 語法int preg_match_all ( string $pattern , string $subject [, array &$matches [, int $flags = PREG…
👁 169
PHP 三元运算符与if的详解

PHP 三元運算符與if的詳解 語言筆記 PHP

三元運算符語條件 ? 結果1 : 結果2 說明:問號前面的位置是判斷的條件,如果滿足條件時結果1,不滿足時結果2。本文對三元運算符和if...else...進行對比詳解,希望對大家有所幫助。今天在改論文在線的時候遇到了一個語句看不懂:$if_summary = $row['IF_SUMMARY']=…
👁 190
PHP强制转换类型

PHP強制轉換類型 語言筆記 PHP PHP採集 PHP與mysql

獲取數據類型1.如果想查看某個表達式的值和類型,用var_dump()。 2.如果只是想得到一個易讀懂的類型的表達方式用於調試,用 gettype()。3.要查看某個類型,不要用 gettype(),而用is_type() 函數。字符串轉換爲數值當一個字符串被當作數字來求值時,根據以下規則來決定結果…
👁 232
php 字符串中是否包含指定字符串的多种方法

php 字符串中是否包含指定字符串的多種方法 語言筆記 PHP

strstrstrstr() 函數搜索一個字符串在另一個字符串中的第一次出現。該函數返回字符串的其餘部分(從匹配點)。如果未找到所搜索的字符串,則返回 false。代碼如下:<?php $email = 'user@example.com'; $domain = strstr($email, …
👁 138

推薦閱讀

(自适应手机端)seo优化博客网站模板 1088

(自適應手機端)seo優化博客網站模板 1088 實用收藏 pbootcms模板

一款SEO優化博客PbootCMS網站模板,支持PC與WAP端。設計風格簡潔知識性,適合SEO博主分享優化技巧、行業動態及案例分析。有助於SEO從業者在線上建立個人品牌與知識影響力。模板展示 安裝說明 網站後臺:/admin.php 賬號:admin 密碼:admin 解壓密碼:www.4s5.cn…
👁 58
响应式家具私人定制网站模板 0920

響應式傢俱私人定製網站模板 0920 實用收藏 易優模板

此套eyoucms響應式模板適用於傢俱私人定製行業,設計風格高端現代,能夠展示定製傢俱產品、設計案例、品牌故事及服務流程。有助於定製傢俱品牌在線上吸引業主,提升品牌形象。模板展示 安裝說明 網站後臺:/login.php 賬號:admin 密碼:admin 相關文章易優CMS安裝常見問題總結易優CM…
👁 62
(PC+WAP)门窗定制pbootcms网站模板 铝合金门窗网站源码下载 0126

(PC+WAP)門窗定製pbootcms網站模板 鋁合金門窗網站源碼下載 0126 實用收藏 pbootcms模板

一款關於門窗定製與鋁合金門窗行業的PbootCMS網站模板,支持PC與WAP端訪問。設計風格現代簡潔,能夠很好地展示門窗產品系列與安裝案例。是門窗品牌或鋁合金加工企業搭建品牌官網、提升線上獲客能力的優質選擇。模板展示 安裝說明 網站後臺:/admin.php 賬號:admin 密碼:admin 解壓…
👁 41
(自适应手机端)膜结构生产厂家网站模板下载 1089

(自適應手機端)膜結構生產廠家網站模板下載 1089 實用收藏 pbootcms模板

一款膜結構生產廠家PbootCMS網站模板,支持PC與WAP端。設計風格現代專業,適合展示膜結構產品、工程案例及設計實力。有助於膜結構公司在線上展示品牌,吸引建築與商業客戶。模板展示 安裝說明 網站後臺:/admin.php 賬號:admin 密碼:admin 解壓密碼:www.4s5.cn相關文章…
👁 50
响应式家具家私销售网站模板 0921

響應式傢俱傢俬銷售網站模板 0921 實用收藏 易優模板

一款針對傢俱傢俬銷售行業的eyoucms響應式網站模板。設計風格現代實用,能夠展示傢俱產品、傢俬系列、家居搭配及品牌故事。有助於傢俱品牌在線上展示產品,吸引家庭消費者。模板展示 安裝說明 網站後臺:/login.php 賬號:admin 密碼:admin 相關文章易優CMS安裝常見問題總結易優CMS…
👁 48
(PC+WAP)陶粒批发企业网站pbootcms模板 工程建筑建材网站源码下载 0127

(PC+WAP)陶粒批發企業網站pbootcms模板 工程建築建材網站源碼下載 0127 實用收藏 pbootcms模板

本套PbootCMS模板適用於陶粒批發及工程建築建材行業,支持PC和移動端。設計風格務實專業,能夠展示陶粒產品在建築領域的應用。有助於建材供應商在線上展示產品參數與工程案例,拓展建築行業客戶。模板展示 安裝說明 網站後臺:/admin.php 賬號:admin 密碼:admin 解壓密碼:www.4…
👁 50