Я разрабатываю простую загрузку php script, и пользователи могут загружать только файлы ZIP и RAR.
Какие типы MIME я должен использовать для проверки $_FILES[x][type]
? (полный список пожалуйста)
Спасибо..
Я разрабатываю простую загрузку php script, и пользователи могут загружать только файлы 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 можно найти по адресу Администрирование номеров Интернета (IANA). В соответствии с их заголовком Content-Type
для zip
есть application/zip
.
Тип носителя для файлов rar
официально не зарегистрирован в IANA, но неофициальное широко используемое значение mime-типа application/x-rar-compressed
.
application/octet-stream
означает столько же, сколько: "Я отправляю вам поток файлов, а содержимое этого потока не указано" (так что это правда, что он может быть также файлом zip
или rar
). Предполагается, что сервер обнаруживает, что такое фактическое содержимое потока.
Примечание.. Для загрузки небезопасно полагаться на тип mime, заданный в заголовке Content-Type
. Заголовок настроен на клиенте и может быть установлен на любое случайное значение. Вместо этого вы можете использовать информацию о файле php file для обнаружения файла mime-типа на сервере.
Если вы хотите загрузить файл zip
, и ничего больше, вы должны установить только одно значение заголовка Accept
. Любые дополнительные значения будут использоваться в качестве резерва в случае, если сервер не сможет удовлетворить ваш запрос в запрошенном типе типа Accept
.
В соответствии с спецификациями WC3:
application/zip, application/octet-stream
будет intrepreted как: "Я предпочитаю mime-тип application/zip
, но если вы не можете доставить это, то application/octet-stream
(поток файлов) также прекрасен".
Итак, только один:
application/zip
Гарантирует вам файл zip
(или ответ 406 - Not Acceptable
в случае, если сервер не сможет удовлетворить ваш запрос).
Нельзя доверять $_FILES['upfile']['mime']
, проверьте тип MIME самостоятельно. Для этой цели вы можете использовать fileinfo
extension, включенный по умолчанию с 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 ) ) { ///
для проверки всех символов после последнего "."