如何在不知道擴展名的情況下檢查文件是否存檔(zip或rar)。我需要使用php來找到它。檢查文件是否存檔(zip或rar)使用php
我無法使用Fileinfo,因爲它沒有安裝並且在服務器上安裝任何其他軟件包而無法正常工作。
更新:
未安裝Zip模塊,我無法安裝額外的軟件包。 我不想使用mime_content_type,因爲它已過時
謝謝
如何在不知道擴展名的情況下檢查文件是否存檔(zip或rar)。我需要使用php來找到它。檢查文件是否存檔(zip或rar)使用php
我無法使用Fileinfo,因爲它沒有安裝並且在服務器上安裝任何其他軟件包而無法正常工作。
更新:
未安裝Zip模塊,我無法安裝額外的軟件包。 我不想使用mime_content_type,因爲它已過時
謝謝
輸出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$
'=== 0'似乎更合適 – hakre 2012-02-01 17:08:51
感謝您的詳細答案 – keepwalking 2012-02-01 18:45:09
感謝您的答案,魚! – liljoshu 2017-04-20 23:14:38
要測試一個文件是否是一個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手冊頁面以獲取更多詳細信息。
您可以從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
閱讀前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存檔。 乾杯
mime_content_type但它的棄用和Fileinfo其未安裝在服務器上,我無法安裝它。 – keepwalking 2012-02-01 15:45:06
$ zip = zip_open($ file); if(is_resource($ zip)){//它的zip} else {//它的非zip |}但是對於rar我不確定 – 2012-02-01 15:45:26
你應該在你的問題中提到這個,這樣你就不會得到建議使用'Fileinfo'的答案。顯然,你提供的信息越多,你會得到更好的答案。 – 2012-02-01 15:46:17