4 ответов:
ответы от freedompeace, Kiyarash и Sam Vloeberghs:
.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 обнаруживает файлы non RAR как архивы SFX:
$ rar.exe l somefile.srr SFX Volume somefile.srr
для загрузки:
официальный список типов mime можно найти по адресу интернет назначил номера власти (IANA) . Согласно их списку на
zip- это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/zipMIME-тип, но если вы не можете доставить этоapplication/octet-stream(a файловый поток) также отлично".так что только один:
application/zipгарантирует вам a (или
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 ) ) { ///чтобы проверить все символы после последней '.-
Comments