.Рар.,тип MIME zip-файлов

Я разрабатываю простой скрипт загрузки php, и пользователи могут загружать только файлы ZIP и RAR.

какие типы MIME я должен использовать для проверки $_FILES[x][type]? (полный список пожалуйста)

спасибо..

4 ответов


ответы от freedompeace, Кияраш и Сэм Влоберс:

.rar    application/x-rar-compressed, application/octet-stream
.zip    application/zip, application/octet-stream, application/x-zip-compressed, multipart/x-zip

Я бы тоже проверил имя файла. Вот как вы можете проверить, является ли файл RAR или ZIP-файлом. Я протестировал его, создав приложение быстрой командной строки.

<?php

if (isRarOrZip($argv[1])) {
    echo 'It is probably a RAR or ZIP file.';
} else {
    echo 'It is probably not a RAR or ZIP file.';
}

function isRarOrZip($file) {
    // get the first 7 bytes
    $bytes = file_get_contents($file, FALSE, NULL, 0, 7);
    $ext = strtolower(substr($file, - 4));

    // RAR magic number: Rar!\x1A\x07\x00
    // http://en.wikipedia.org/wiki/RAR
    if ($ext == '.rar' and bin2hex($bytes) == '526172211a0700') {
        return TRUE;
    }

    // ZIP magic number: none, though PK34, PK56 (empty archive), 
    // or PK78 (spanned archive) are common.
    // http://en.wikipedia.org/wiki/ZIP_(file_format)
    if ($ext == '.zip' and substr($bytes, 0, 2) == 'PK') {
        return TRUE;
    }

    return FALSE;
}

обратите внимание, что он все еще не будет на 100% уверен, но это, вероятно, достаточно хорошо.

$ rar.exe l somefile.zip
somefile.zip is not RAR archive

но даже WinRAR обнаруживает не RAR файлы как SFX архивы:

$ rar.exe l somefile.srr
SFX Volume somefile.srr

для загрузки:

официальный список типов mime можно найти в в Интернете присвоены номера администрации (IANA). Согласно их списку на zip is application/zip.

тип носителя для rar файлы официально не зарегистрированы в IANA, но неофициальное широко используемое значение MIME-типа application/x-rar-compressed.

application/octet-stream - это: " я посылаю вам файловый поток, и содержимое этого потока не указано" (так это правда, что это может быть zip или rar файл также). Сервер должен определить, что такое фактическое содержимое потока.

Примечание: для загрузки не безопасно полагаться на тип mime, установленный в Content-Type заголовок. Заголовок устанавливается на клиенте и может быть установлен на любое случайное значение. Вместо этого вы можете использовать информация о файле php функции для обнаружения типа MIME файла на сервере.


для скачать:

если вы хотите скачать zip файл и ничего больше, вы должны задать только один Accept значение заголовка. Любой дополнительный набор значений будет использоваться в качестве резервного в случае, если сервер не может удовлетворить ваши в Accept заголовок запросил mime-тип.

по словам WC3 спецификации это:

application/zip, application/octet-stream 

будет intrepreted как:"я предпочитаю application/zip mime-type, но если вы не можете доставить это application/octet-stream (a file stream) также в порядке".

так что только один:

application/zip

гарантируем (или 406 - Not Acceptable ответ в случае, если сервер не может удовлетворить ваш запрос).


вы не должны доверять $_FILES['upfile']['mime'], проверьте тип MIME самостоятельно. Для этой цели вы можете использовать fileinfo расширение, включен по умолчанию с PHP 5.3.0.

  $fileInfo = new finfo(FILEINFO_MIME_TYPE);
  $fileMime = $fileInfo->file($_FILES['upfile']['tmp_name']);
  $validMimes = array( 
    'zip' => 'application/zip',
    'rar' => 'application/x-rar',
  );

  $fileExt = array_search($fileMime, $validMimes, true);
  if($fileExt != 'zip' && $fileExt != 'rar')
    throw new RuntimeException('Invalid file format.');

примечание: не забудьте включить расширение в свой php.ini и перезагрузите сервер:

extension=php_fileinfo.dll

поскольку расширение может содержать более или менее трех символов, следующее будет тестировать расширение независимо от его длины.

попробуйте это:

$allowedExtensions = array( 'mkv', 'mp3', 'flac' );

$temp = explode(".", $_FILES[$file]["name"]);
$extension = strtolower(end($temp));

if( in_array( $extension, $allowedExtensions ) ) { ///

для проверки всех символов после последнего '.'