.rar, .zip-файлы MIME-тип

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

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

Спасибо..

Ответ от свободы слова:

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

Я также проверил бы имя файла. Вот как вы можете проверить, является ли файл 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 PK\003\004, PK\005\006 (empty archive), // or PK\007\008 (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 можно найти в авторитете Internet Assigned Numbers Authority (IANA) . Согласно их списку заголовок Content-Type для zip является application/zip .

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

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

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


Для скачивания:

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

Согласно спецификациям WC3 это:

 application/zip, application/octet-stream 

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

Так что только сингл:

 application/zip 

Гарантирует вам 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 ) ) { /// 

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