2012-02-01 84 views
11

如何在不知道擴展名的情況下檢查文件是否存檔(zip或rar)。我需要使用php來找到它。檢查文件是否存檔(zip或rar)使用php

我無法使用Fileinfo,因爲它沒有安裝並且在服務器上安裝任何其他軟件包而無法正常工作。

更新:

未安裝Zip模塊,我無法安裝額外的軟件包。 我不想使用mime_content_type,因爲它已過時

謝謝

+0

mime_content_type但它的棄用和Fileinfo其未安裝在服務器上,我無法安裝它。 – keepwalking 2012-02-01 15:45:06

+1

$ zip = zip_open($ file); if(is_resource($ zip)){//它的zip} else {//它的非zip |}但是對於rar我不確定 – 2012-02-01 15:45:26

+1

你應該在你的問題中提到這個,這樣你就不會得到建議使用'Fileinfo'的答案。顯然,你提供的信息越多,你會得到更好的答案。 – 2012-02-01 15:46:17

回答

9

輸出od -c

0000000 R a r ! 032 \a \0 317 220 s \0 \0 \r \0 \0 \0 

    0000000 P K 003 004 \n \0 \0 \0 \0 \0 \0 \0 ! \0 \0 \0 

你可以使用這樣的事情:

<?php 

$fh = @fopen($argv[1], "r"); 

if (!$fh) { 
    print "ERROR: couldn't open file.\n"; 
    exit(126); 
} 

$blob = fgets($fh, 5); 

fclose($fh); 

if (strpos($blob, 'Rar') !== false) { 
    print "Looks like a Rar.\n"; 
} else 
if (strpos($blob, 'PK') !== false) { 
    print "Looks like a ZIP.\n"; 
} else { 
    print "I dunno.\n"; 
    exit(1); 
} 

?> 

而我的輸出:

[email protected]:~ 423$ ./filephp.php A2.rar 
Looks like a Rar. 
[email protected]:~ 424$ ./filephp.php OLDIE.zip 
Looks like a ZIP. 
[email protected]:~ 425$ ./filephp.php 1-11-1.PDF 
I dunno. 
[email protected]:~ 426$ 
+2

'=== 0'似乎更合適 – hakre 2012-02-01 17:08:51

+0

感謝您的詳細答案 – keepwalking 2012-02-01 18:45:09

+0

感謝您的答案,魚! – liljoshu 2017-04-20 23:14:38

4

要測試一個文件是否是一個zip壓縮包,你可以嘗試打開它使用open_zip功能的拉鍊。對於rar,您需要安裝PECL rar(最好版本至少2.0.0) - 有關更多詳細信息,請參閱http://php.net/manual/en/book.rar.php。代碼看起來是這樣的:

if(is_resource($zip = zip_open($filename)) 
{ 
    zip_close($zip); 
    //this is a zip archive 
} 
else(($rar = RarArchive::open($filename)) !== FALSE) 
{ 
    $rar->close(); 
    //this is a rar archive 
} 
else 
{ 
    //this is not a zip or rar archive 
} 

你可能需要做一些額外的工作,如果檔案是密碼保護。閱讀相應的php手冊頁面以獲取更多詳細信息。

+0

順便說一句,如果 – shadi 2016-06-17 09:11:37

+0

的Btw缺少pantheses另外,如果文件大小爲零,這將返回'這是一個zip'。使用'if(filesize($ zipfile)== 0)返回false;'返回'這不是一個zip' – shadi 2016-06-17 18:21:20

+1

您的代碼易受ZIP炸彈攻擊。 – 2017-05-20 15:07:21

1

fileinfo功能來幫助你完成這個,通過檢查文件的MIME類型:

$finfo = finfo_open(FILEINFO_MIME_TYPE); 
echo finfo_file($finfo, $filename); // This will return the mime-type 
finfo_close($finfo); 
+0

在某些系統上,這往往會導致Office 2007+文檔(DOCX,XLSX,PPTX)失敗,因此手動檢查是不可避免的。 – flu 2013-09-03 09:50:32

1

您可以從unix file命令輸出信息並解析它(假設您可以執行系統命令,這是不好的做法)。

這是centos「文件文件名稱」輸出的示例。

[RR @本地圖像](主)#文件UI-anim_basic_16x16.gif UI-anim_basic_16x16.gif:GIF圖像數據,版本89A,16×16

[RR @本地圖像](主站)#文件UI-icons_454545_256x240.png UI-icons_454545_256x240.png:PNG圖像數據,256×240,8-位的顏色表,非隔行掃描

[RR @本地供應商](主)#文件jquery的驗證-1.9.0.zip jquery-validation-1.9.0.zip:Zip檔案資料,至少要提取v1.0

也像其他人一樣建議,你可以讀幾個字節並檢查它們是否與簽名匹配。

對RAR

識別字符十六進制:52 61 72 21 1A 07 00,ASCII:的RAR!

用於拉鍊

識別字符十六進制:50 4B 03 04,ASCII:PK

1

閱讀前10個字節的文件。如果它們是(80,75,3,4,20,0,0,0,8,0),它是一個ZIP文件。 RAR文件包含以下7個第一個字節:(82,97,114,33,26,7,0) 如果您在文本編輯器(例如Notepad ++)中打開ZIP文件,您將看到: PK [ETX ] [EOT] [DC4] [NUL] [NUL] [NUL] [BS] [NUL] ....->上面列出了字符的ASCII碼。 對於RAR文件,圖片是: RAR![SUB] [BEL] [NUL] .... 因此,只需讀取文件的10個第一個字節,就可以知道它是ZIP還是RAR存檔。 乾杯

+2

如果問題是關於檢查它的PHP,我不知道什麼記事本++或任何文本編輯器相關的解決方案幫助.. – Tom 2012-11-01 18:54:39

+2

你應該只檢查「\ x50 \ x4b \ x03 \ x04」的前4個字節,因爲它們是PKZip文件的唯一簽名。例如,第5和第6個字節表示提取所需的PKZip版本(在您的示例2.0中),可能會有所不同。請參閱:[ZIP文件的結構](https://users.cs.jmu.edu/buchhofp/forensics/formats/pkzip.html#localheader) – flu 2013-09-03 09:48:09

相關問題