MIME, октет-поток и Uploadify - PullRequest
0 голосов
/ 27 июля 2011

Я использую Uploadify и Kohana , и я создаю загрузчик файлов. Пользователь может загружать только несколько типов файлов.

Кохана имеет большую встроенную библиотеку типов MIME. Я подумал, что было бы здорово проверить, чтобы MIME-тип загружаемого файла (он был загружен из Uploadify) соответствовал установленным расширениям файлов. Вот почему я создал массив разрешенных типов MIME.

$mimes         = (array) Kohana::config('mimes');
$allowed_mimes = array_merge($mimes['bmp'], $mimes['gif'], $mimes['jpg'], $mimes['jpeg'], $mimes['png']);

Далее я хотел проверить, что MIME-тип загружаемых файлов находится в массиве $allowed_mimes. Я использовал что-то вроде in_array($file['type'], $allowed_mimes). К удивлению для меня - фактический MIME файла был application/octet-stream. Во всяком случае, загруженный файл был JPEG изображение. Как это возможно?

Основная идея заключается в том, что мне нужно проверить тип файла. Какой лучший способ сделать это?

Edit:

После некоторых бесед с моими коллегами я решил проверить символы после последней точки. Вроде virus.jpeg приемлемо, потому что jpeg в его названии. Я все еще открыт для лучших решений!

$extension = ltrim(strrchr($file['name'], '.'), '.')

1 Ответ

3 голосов
/ 28 июля 2011

PHP может использовать fileinfo и MIME Magic (был удален из PHP 5.3.0) для определения типа файлов MIME (как и метод Kohanas File::mime()).

В случае, если ни один из этих 2 недоступен, этот метод попытается найти тип MIME, используя расширение файлов, которое может быть крайне ненадежным.

Поскольку вы пытаетесь только проверить какую-либо загрузку, я бы предложил использовать Upload методы для ее проверки:

$validation = Validation::factory($_FILES)
    ->rule('Filedata', 'Upload::not_empty')
    ->rule('Filedata', 'Upload::valid')
    ->rule('Filedata', 'Upload::size',  array(':value', '4M'))
    ->rule('Filedata', 'Upload::type',  array(':value', array('bmp','jpg','jpeg','png')))
    ->rule('Filedata', 'Upload::image', array(':value', 1920, 1080));

Обратите внимание, что Upload::image() доступен начиная с версии 3.2.0 (вы можете импортировать его и в более старые версии). Это проверка, которую я лично использую для загрузки Uploadify, поэтому она должна работать нормально.

...