Проверьте, является ли файл архивом (zip или rar), используя php
Как проверить, архивируется ли файл (zip или rar), не зная расширения. Мне нужно найти его с помощью php.
Я не могу использовать Fileinfo, потому что его не установили и не установили какие-либо другие пакеты на сервере, о чем это не могло быть и речи.
UPDATE:
Zip-модуль не установлен, и я не могу установить дополнительные пакеты.
Я не хочу использовать mime_content_type, потому что его устаревший
Спасибо
Ответы
Ответ 1
Выход из 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
Чтобы проверить, является ли файл архивом zip, вы можете попытаться открыть его как 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.
Ответ 3
Функции fileinfo должны помочь вам в этом, установив тип файла mime:
$finfo = finfo_open(FILEINFO_MIME_TYPE);
echo finfo_file($finfo, $filename); // This will return the mime-type
finfo_close($finfo);
Ответ 4
Вы можете вывести информацию из команды unix file и проанализировать ее (при условии, что вы можете выполнять системные команды, что является плохой практикой).
Это пример вывода данных файла "centos" file filename ".
[rr @localhost images] (мастер) # файл ui-anim_basic_16x16.gif ui-anim_basic_16x16.gif: данные изображения GIF, версия 89a, 16 x 16
[rr @localhost images] (мастер) # файл ui-icons_454545_256x240.png ui-icons_454545_256x240.png: данные изображения PNG, 256 x 240, 8-битная цветовая карта, без чередования
[rr @localhost vendors] (мастер) # файл jquery-validation-1.9.0.zip jquery-validation-1.9.0.zip: данные архива Zip, как минимум v1.0 для извлечения
Также, как и другие люди, вы можете прочитать несколько байтов и проверить, соответствуют ли они сигнатуре.
для rar
Идентификация символов Hex: 52 61 72 21 1A 07 00, ASCII: Rar!
для zip
Идентификация символов Hex: 50 4B 03 04, ASCII: PK
Ответ 5
Прочитайте первые 10 байтов файла. Если они (80, 75, 3, 4, 20, 0, 0, 0, 8, 0), это ZIP файл.
Файлы RAR имеют следующие 7 первых байтов: (82, 97, 114, 33, 26, 7, 0)
Если вы открываете ZIP файл в текстовом редакторе (например, Notepad ++), вы увидите:
PK [ETX] [EOT] [DC4] [NUL] [NUL] [NUL] [BS] [NUL]....- > коды Ascii для символов перечислены выше.
Для файлов RAR изображение:
Рар! [SUB] [BEL] [NUL]....
Итак, просто прочитайте 10 первых байтов файла, и вы можете узнать, является ли это архивом ZIP или RAR.
Приветствия