亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
最近訪(fǎng)問(wèn)板塊 發(fā)新帖
查看: 1190 | 回復(fù): 0
打印 上一主題 下一主題

PHP V5.2 中的新增功能,第 4 部分: 使用新的 ZIP 擴(kuò)展 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2007-08-20 14:38 |只看該作者 |倒序?yàn)g覽

PHP V5.2 中的新增功能,第 4 部分: 使用新的 ZIP 擴(kuò)展
如何創(chuàng)建和編輯 ZIP 文件
Tracy Peterson
(
[email=tracy@tracypeterson.com?subject=使用新的 ZIP 擴(kuò)展&cc=dwxed@us.ibm.com]tracy@tracypeterson.com[/email]
), 自由撰稿人, Consultant
2007 年 6 月 08 日
需要使用 ZIP?現(xiàn)在可用了!PHP 最近把 ZIP 功能添加到了 PHP V5.2 中。這些功能現(xiàn)已被內(nèi)置于 PHP V5.2 中。本文是“
What's new in PHP V5.2
”系列文章(共五部分)的第 4 部分,將向您展示如何通過(guò)創(chuàng)建、編輯、上傳和讀取以及創(chuàng)建和下載 ZIP 文件來(lái)充分利用此新增功能。閱讀本文后,您將十分精通使用 PHP V5.2 中的最新 ZIP PHP 擴(kuò)展處理 ZIP 文件的技巧,這樣在用 PHP 處理大型文件時(shí)就可以降低帶寬負(fù)載和存儲(chǔ)設(shè)備使用量。
ZIP 簡(jiǎn)介
1989 年引入的 ZIP 文件格式通過(guò)刪除文件中的空白空間和冗余信息以及把多個(gè)文件打成一個(gè)包的方式,幫助計(jì)算機(jī)用戶(hù)傳輸大型文件。ZIP 最初是由 Phil Katz 為共享件程序 PKZIP 創(chuàng)建的,ZIP 是一種快速、可靠且遵循開(kāi)放規(guī)范的壓縮格式。這些因素使 ZIP 在 PC 用戶(hù)中大獲成功,并且其開(kāi)放規(guī)范使程序員可以把 ZIP 構(gòu)建到 Windows®、OS X、Konqueror 和 Nautilus 文件管理器中?紤]使用幾乎所有計(jì)算機(jī)都可以處理的 ZIP 文件壓縮格式是十分安全的。
壓縮通常有很多好處,可以縮小文件大小,也可以把若干個(gè)文件綁定為一個(gè)歸檔文件。通過(guò)減少文件大小,帶寬和存儲(chǔ)設(shè)備負(fù)載也會(huì)隨之減少。文件大小要求很明顯,但是當(dāng)惟一的其他選擇是一個(gè)接一個(gè)地下載時(shí),能夠把若干個(gè)文件綁定在一起就是一個(gè)巨大的優(yōu)點(diǎn)。您可以為用戶(hù)提供把許多單個(gè)文件創(chuàng)建為一次下載的功能,使您可以更便捷地把產(chǎn)品或服務(wù)交付給用戶(hù)。
由于幾乎所有計(jì)算機(jī)中都可以使用 ZIP,因此使用它來(lái)壓縮應(yīng)用程序是非常好的選擇,尤其是在用戶(hù)將把文件下載到桌面型計(jì)算機(jī)中時(shí)。例如,Windows XP 用戶(hù)可以便捷地使用本機(jī) ZIP 支持,稱(chēng)為壓縮文件夾。當(dāng) Windows XP 用戶(hù)下載 ZIP 文件時(shí),它顯示為用戶(hù)可以雙擊打開(kāi)的壓縮文件夾。OS X、Konqueror 和 Nautilus 用戶(hù)也只需雙擊 ZIP 文件即可打開(kāi)文件。




被壓縮掉的空間去了哪里?
被選中放入歸檔(ZIP 文件的另一個(gè)名稱(chēng))中的文件都列在文件結(jié)構(gòu)中,然后就被縮小或壓縮了。文件都是使用眾多壓縮算法中的一種算法壓縮成一個(gè) ZIP 文件的,但這些壓縮算法都是以相同的方法操作:刪除冗余數(shù)據(jù)或空白。這種方法在應(yīng)用到可以減少大量重復(fù)文字和標(biāo)點(diǎn)符號(hào)來(lái)節(jié)省空間的文本文件中時(shí)尤為有效。當(dāng)處理圖形文件(例如 JPEG 圖像)時(shí),壓縮就不那么好用了,因?yàn)閿?shù)據(jù)更加難于減少重復(fù)。
減少文件大小有若干種方法,并且對(duì)于 ZIP 格式,它們?nèi)际浅R?jiàn)方法。可以運(yùn)用 ZIP 的每種語(yǔ)言或每個(gè)應(yīng)用程序都知道這些格式,而且 PHP 也不例外。PHP 將像其他應(yīng)用程序一樣使用這些算法之一來(lái)壓縮文件,并獲得任何其他語(yǔ)言或程序?qū)@得的結(jié)果。讓我們來(lái)看一個(gè)示例:
讓我們引用我最崇拜的歷史人物之一邱吉爾經(jīng)常說(shuō)的一段話(huà)。文本文件 Winston.txt 包含以下文本:“You make a living by what you get; you make a life by what you give.”。
要壓縮文件 Winston.txt,可以刪除不必要的空格,方法為創(chuàng)建索引 —— 就像搜索引擎那樣操作 —— 并用此索引的副本和索引組件布局的方法清單來(lái)替換文件組件。使用像本例這樣非常小的示例,如果沒(méi)有重復(fù)的單詞,則索引的大小會(huì)十分接近示例的大小。僅當(dāng)單詞重復(fù)出現(xiàn)時(shí),才能將其添加到索引中,因此這應(yīng)當(dāng)不會(huì)成為一個(gè)問(wèn)題。
在我們的示例中,有以下重復(fù)的單詞:
  • “we” 使用了四次
  • “make” 使用了兩次
  • “a” 使用了兩次
  • “by” 使用了兩次
  • “what” 使用了兩次
    還剩下幾個(gè)只需寫(xiě)出的單個(gè)單詞:
  • “l(fā)iving”
  • “get”
  • “l(fā)ife”
  • “give”
    如果使用索引寫(xiě)出我們的示例,則得到 “1 2 3 living 4 5 1 get; 1 2 3 life 4 5 1 give.”。
    您已經(jīng)可以看到該文件現(xiàn)在包含的信息要少一些。為了準(zhǔn)確,您可以算一下并確定省去了多少字符。原文件共有 64 個(gè)字符(包括標(biāo)點(diǎn)符號(hào))。如果把索引中的注釋減少為更簡(jiǎn)單的內(nèi)容(如 1we4),則將把索引減少到 23 個(gè)字符并加上實(shí)際字符串字符總數(shù) 33 等于 56。文件大小沒(méi)有大幅減少,但是如果把演說(shuō)的其余部分添加到文件中,您將會(huì)開(kāi)始看到壓縮中的重大改進(jìn)。索引將變得更大,但是每個(gè)單詞的實(shí)例數(shù)也將增加。索引負(fù)載將開(kāi)始減少,并且您將看到一個(gè)優(yōu)秀的壓縮率。
    文本文件的壓縮率平均為 70% 左右;而對(duì)于更復(fù)雜更難于壓縮的文件(例如圖像),其壓縮率大約 10%。




    回頁(yè)首
    ZIP 中有哪些內(nèi)容?
    由于 ZIP 歸檔可以有多個(gè)文件,因此 ZIP 歸檔都有自己的文件結(jié)構(gòu),就像您的本地計(jì)算機(jī)的文件系統(tǒng)一樣。此結(jié)構(gòu)是圍繞條目構(gòu)建的,并允許巧妙的編碼器在解壓縮時(shí)從許多文件中只選出一個(gè)文件。當(dāng)您只需要?dú)w檔文件中的一張圖片或一個(gè)文本文件時(shí),此結(jié)構(gòu)會(huì)十分便捷。此結(jié)構(gòu)還將維護(hù)目錄信息,目錄信息在傳輸 Web 站點(diǎn)或有文件系統(tǒng)關(guān)系依賴(lài)性的其他文件組時(shí)將極為有用。
    在 PHP 腳本中,每個(gè)文件都有一組可用的文件相關(guān)信息。打開(kāi)文件時(shí),您將能夠在創(chuàng)建的 ZipArchive 對(duì)象中訪(fǎng)問(wèn)這些信息。這些信息可用于各種目的,例如檢驗(yàn)解壓縮后的文件大小或只創(chuàng)建 ZIP 文件的內(nèi)容清單而不打開(kāi)它。
    PHP ZIP 的部分功能允許以十分有用的方法處理這些文件結(jié)構(gòu)。在下一個(gè)示例中,我們將展示幾種方法查看這些功能并了解如何在創(chuàng)建 ZIP 文件的過(guò)程中創(chuàng)建 ZIP 文件結(jié)構(gòu)。




    回頁(yè)首
    繼續(xù)壓縮
    讓我們?cè)賮?lái)看一個(gè)使用 PHP 創(chuàng)建 ZIP 文件的示例。我將使用的代碼示例幾乎與 PHP.net 手冊(cè)文檔提供的示例完全相同,只有幾處修改(有關(guān) ZIP 功能頁(yè)面,請(qǐng)參閱
    參考資料
    )。讓我們?yōu)g覽一下創(chuàng)建 ZIP 文件的步驟并查看如何正確構(gòu)建文件結(jié)構(gòu)。我們將把字符串作為文件插入到新 ZIP 中,并把現(xiàn)有文件獲取到新 ZIP 中。
    首先,需要準(zhǔn)備好一個(gè)要添加到 ZIP 中的文本文件。
    清單 1. testtext.txt
                   
    Had I the heavens' embroidered cloths,
    Enwrought with golden and silver light,
    The blue and the dim and the dark cloths
    Of night and light and the half-light,
    I would spread the cloths under your feet:
    But I, being poor, have only my dreams;
    I have spread my dreams under your feet,
    Tread softly because you tread on my dreams.
    William Butler Yeats
    您可以測(cè)試這段代碼以直接查看這次嘗試的結(jié)果。如果要測(cè)試,應(yīng)當(dāng)剪切和粘貼清單 1,并將它與 PHP 腳本放在同一目錄下。將此文件另存為 testtext.txt,因?yàn)閷⒃?PHP 代碼中引用此名稱(chēng)。
    接下來(lái),需要?jiǎng)?chuàng)建 ZIP 文件。
    清單 2. zipcreate.php
                   
    open($filename, ZIPARCHIVE::CREATE)!==TRUE) {
       exit("cannot open \n");
    }
    $zip->addFromString("firstfile." . time() . ".txt", \
    "This is the first file in our ZIP, added as
    firstfile.txt.\n");
    $zip->addFromString("testdir/secondfile." . time() . ".txt", \
    "This is the second file in our ZIP,
    added as secondfile.txt in the testdir directory.\n");
    echo "numfiles: " . $zip->numFiles . "\n";
    $zip->close();
    ?>
    首先在第一行中創(chuàng)建新的 ZIP 歸檔對(duì)象。創(chuàng)建了對(duì)象后,將為文件名設(shè)置一個(gè)變量,以供稍后在腳本中使用?梢悦看味硷@式調(diào)用該文件名,但是設(shè)置一個(gè)變量以供多次使用會(huì)更輕松。常量 ZIPARCHIVE::CREATE 表示如果具有該名稱(chēng)的文件尚不存在,則應(yīng)當(dāng)創(chuàng)建一個(gè)新文件。如果這是您第一次運(yùn)行腳本,將新建 ZIP 文件。如果這個(gè)結(jié)果沒(méi)有出現(xiàn),腳本將顯示錯(cuò)誤并退出。
    接下來(lái),使用 addFromString() 方法,該方法允許您使用字符串?dāng)?shù)據(jù)或通過(guò)字符串變量在 ZIP 歸檔中創(chuàng)建條目。需要?jiǎng)?chuàng)建文件句柄,才能在 ZIP 文件結(jié)構(gòu)中識(shí)別文件。在這種情況下,使用了 firstfile.txt 作為文件名,同時(shí)還使用了它的創(chuàng)建時(shí)間。字符串?dāng)?shù)據(jù)隨后被存儲(chǔ)。接下來(lái)在處理 secondfile.txt 時(shí)將再執(zhí)行一次該操作,但是這次我們添加了目錄。您可以看到文件標(biāo)識(shí)符 secondfile.txt 實(shí)際上列有路徑的下一級(jí)。它將顯示在 testdir 目錄中。
    我們向用戶(hù)展示歸檔中的文件數(shù)并關(guān)閉文件,將其保存為 ZIP 歸檔,準(zhǔn)備供用戶(hù)下載。您可能會(huì)注意到在連續(xù)按 Refresh 或用其他方法運(yùn)行 PHP 腳本時(shí),ZIP 中的文件數(shù)會(huì)增長(zhǎng)。這是因?yàn)橐恢痹诖蜷_(kāi)同一個(gè)目錄中的同一個(gè)文件,添加兩個(gè)字符串作為文件,并再次關(guān)閉。
    圖 1. zipcreate.php 的樣例輸出


    正如您會(huì)注意到的,實(shí)際上并未把新文件添加到 ZIP 中。我們需要把詩(shī)歌放在其中,以便用戶(hù)獲得一些訓(xùn)練。讓我們現(xiàn)在就來(lái)添加。
    清單 3. 將外部文件添加到 newzip.zip 中
                   
    open($filename, ZIPARCHIVE::CREATE)!==TRUE) {
       exit("cannot open \n");
    }
    $zip->addFromString("firstfile." . time() . ".txt", \
    "This is the first file in our ZIP, added as
    firstfile.txt.\n");
    $zip->addFromString("testdir/secondfile." . time() . ".txt", \
    "This is the second file in our ZIP,
    added as secondfile.txt.\n");
    $zip->addFile("testtext.txt");
    echo "numfiles: " . $zip->numFiles . "\n";
    $zip->close();
    ?>
    這樣看來(lái),路徑是相對(duì)的,只是指向了需要添加到 ZIP 中的文件并使用 addFile() 方法把它打包在其中。如果文件 testtext.txt 位于同一個(gè)目錄中,這樣做可以將其添加到歸檔中,F(xiàn)在已經(jīng)通過(guò)任意的字符串?dāng)?shù)據(jù)創(chuàng)建了新歸檔文件并已經(jīng)把外部文件添加到了歸檔中。這些都是創(chuàng)建新歸檔時(shí)最常見(jiàn)的任務(wù)。




    回頁(yè)首
    打開(kāi)歸檔
    如果我們不能從歸檔中恢復(fù)出可正常使用的文件,那么 ZIP 文件就沒(méi)有多大用處。一些程序可以把文件直接從歸檔中讀出,但是這些程序必須先把文件解壓縮。最常見(jiàn)的處理方法是,簡(jiǎn)單地打開(kāi)整個(gè)文件并將其展開(kāi)為單個(gè)組件文件,把這些文件準(zhǔn)備好以供正常使用。出于我們的目的,將打開(kāi)先前創(chuàng)建的 ZIP 文件并查看其內(nèi)容。
    清單 4. zipread.php
                   
    open($filename)!==TRUE) {
       exit("cannot open \n");
    }
    print_r($zip);
    var_dump($zip);
    echo "
    ";
    echo "The file " .$filename. " has the following files:\n
    ";
    for ($i=0; $inumFiles;$i++) {
       echo "index: $i\n";
       print_r($zip->statIndex($i));
       echo "
    \n";
    }
    $zip->extractTo('./testdestination/');
    $zip->close();
    ?>
    像以前一樣,在名為 $zip 的變量表單中創(chuàng)建 ZipArchive 類(lèi)的新實(shí)例。使用 ZipArchive 的 open() 方法,打開(kāi)已創(chuàng)建的 ZIP 歸檔。if 語(yǔ)句將用作簡(jiǎn)單的錯(cuò)誤控制,如果由于用戶(hù)的小失誤而導(dǎo)致它未找到文件,則退出腳本。如果成功打開(kāi)文件,腳本將繼續(xù)執(zhí)行并把關(guān)于 ZIP 歸檔的一些信息打印給用戶(hù)。
    到此為止,我們完成了兩項(xiàng)重要任務(wù)。逐個(gè)列出了 ZIP 歸檔中的文件。由于將從 $zip 對(duì)象輸出索引數(shù)組,因此將獲得大量數(shù)據(jù),包括文件大小、校驗(yàn)和信息。要減少數(shù)據(jù)量,在特定索引中查看文件的各個(gè)屬性即可。
    一旦打印出文件中的內(nèi)容,所有內(nèi)容就會(huì)被釋放到名為 testdestination 的目錄中。如果此目錄不可用,系統(tǒng)將為我們創(chuàng)建該目錄。此時(shí)需要注意的是如果目錄已存在,或者如果解壓縮的目標(biāo)目錄中已經(jīng)有同名文件,則 ZIP 函數(shù)將覆蓋原有內(nèi)容。
    我們已經(jīng)打開(kāi)了 ZIP 歸檔,通過(guò)保存到本地目錄為使用文件做好了準(zhǔn)備,并且列出了內(nèi)容,可為修改初始的 ZIP 文件做好準(zhǔn)備。這些簡(jiǎn)單的任務(wù)只是一個(gè)開(kāi)始,并且?guī)缀醪荒苡糜谧顝?fù)雜應(yīng)用程序的文件壓縮。巧妙地使用壓縮可以為所有類(lèi)型的文件傳輸帶來(lái)更多便利。PHP 中的 ZIP 本機(jī)支持將使大量文件傳輸問(wèn)題得以解決。




    回頁(yè)首
    結(jié)束語(yǔ)
    在處理?yè)碛写罅靠瞻谆蛑貜?fù)數(shù)據(jù)的大型文件時(shí),ZIP 是一種十分優(yōu)秀方法,能夠降低帶寬負(fù)載或存儲(chǔ)設(shè)備使用量。我們可以清理掉文件中的大量冗余或空白,并使其減少到只包含基本要素,從而使文件更加緊湊。這樣做都可以明顯地減少文件在文件系統(tǒng)中占用的空間大小以及移動(dòng)文件時(shí)所需的全部帶寬負(fù)載。
    一種可能的應(yīng)用是在需要把大量文件上傳到服務(wù)器上時(shí),比如需要把照片上傳到照片庫(kù)中或上傳許多文本文件。您可以簡(jiǎn)單地 ZIP 文件并同樣讓上傳腳本將文件解壓縮,而不用費(fèi)力地在上傳對(duì)話(huà)框中逐個(gè)上傳文件。這可以免去必須單擊 Browse 對(duì)話(huà)框的痛苦。
    一般而言,ZIP 那些不會(huì)被直接訪(fǎng)問(wèn)的文件或者下載后再使用的文件是個(gè)好主意 —— 并且我們最終使 PHP 擁有了這種功能。

    參考資料
    學(xué)習(xí)

    獲得產(chǎn)品和技術(shù)

    • 使用
      IBM 試用軟件
      構(gòu)建您的下一個(gè)開(kāi)發(fā)項(xiàng)目,這些軟件可以通過(guò)下載或從 DVD 中獲得。
    • 下載
      IBM 產(chǎn)品評(píng)估版本
      ,并開(kāi)始使用 DB2®、Lotus®、Rational®、Tivoli® 和 WebSphere® 的應(yīng)用程序開(kāi)發(fā)工具和中間件產(chǎn)品。

    討論


    關(guān)于作者


    自 1997 年以來(lái),Tracy Peterson 擔(dān)任過(guò) IT 項(xiàng)目經(jīng)理和 Web 開(kāi)發(fā)人員,并且目前擔(dān)任 Microsoft 的 MSN Search 的運(yùn)算程序主管。他目前的工作地點(diǎn)位于舊金山。


    本文來(lái)自ChinaUnix博客,如果查看原文請(qǐng)點(diǎn):http://blog.chinaunix.net/u/12569/showart_363849.html
  • 您需要登錄后才可以回帖 登錄 | 注冊(cè)

    本版積分規(guī)則 發(fā)表回復(fù)

      

    北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
    未成年舉報(bào)專(zhuān)區(qū)
    中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
    感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

    清除 Cookies - ChinaUnix - Archiver - WAP - TOP