Проверьте, является ли файл архивом (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. Приветствия