Mime-типы в uploads

Нашли ошибку в CI? — пишем сюда!

Mime-типы в uploads

Сообщение MAX 11 май 2009, 15:23

Еще раз подниму тему uploads в CodeIgniter (1.7.1). В данном случае ошибка в том, что CodeIgniter прверяет не расширение, а mime-тип загружаемого файла. Я долго бился, почему например нельзя загрузить rar-файл - CodeIgniter упорно ругается, что тип не разрешен. Хотя он указан в allowed_types. После того, как я прописываю его в конфигурационном mimes.php, проблема остается.

Так вот. Mime судя по всему формируется браузером. В итоге выяснилось, то разные браузеры по разному генерируют этот тип. Поэтому разработчики в $mimes просто ввели массивы со всеми возможными вариантами.

Я немного поковырял и выяснилось, что FireFox следующие файлы отдает как application/octet-stream, поэтому типы должны быть такими:
Код: Выделить всё
'gz'    =>    array('application/octet-stream', 'application/gzip'),
'rar'    =>    'application/octet-stream',
'7z'    =>    'application/octet-stream',
'flv'    =>    'application/octet-stream' 


А вот прописанный

Код: Выделить всё
'gz'    =>    'application/x-gzip', 

почему-то не работает в FireFox. (Есть у меня вообще подозрения, что браузер при определении типа учитывает установленные программы в системе.)

Итак, чтобы не париться с этими mime, в uploads следует вообще отключить её проверку и тупо проверять расширение загружаемого файла. Таким образом в файле system\libraries\uploads.php переписываем функцию is_allowed_filetype():

Код: Выделить всё

    function is_allowed_filetype
()
    {
        if (count($this->allowed_types) == 0 OR ! is_array($this->allowed_types))
        {
            $this->set_error('upload_no_file_types');
            return FALSE;
        }
        
    
# MaxSite CMS
    # убираем к чертям проверку на mime - пусть буржуи пользуются :-E
    # теперь так: проверяется file_ext с тем, что в allowed_types
    # если есть, значит разрешено, иначе false
    # убрать точку из расширения

        return in_array(str_replace('.', '', $this->file_ext), $this->allowed_types);
    }
 


Теперь просто указываем нужные allowed_types. :ugeek:
MAX
 
Сообщения: 56
Зарегистрирован: 08 фев 2009, 13:28

Re: Mime-типы в uploads

Сообщение r00les 22 июн 2009, 11:27

Дописал функцию ( для БУРЖУЕВ ), думаю так она будет адекватно проверять не только по расширению файла, но и по его mime ( так безопаснее ):

Код: Выделить всё
    function is_allowed_filetype()
    {
        if (count($this->allowed_types) == 0 OR ! is_array($this->allowed_types))
        {
            $this->set_error('upload_no_file_types');
            return FALSE;
        }
        $fType = str_replace(".", "", $this->file_ext);
        if (in_array($fType, $this->allowed_types))
        {
            $mimes = $this->mimes_types(strtolower($fType));
            if ( is_array($mimes) )
            {
                foreach( $mimes as $mime )
                {
                    if ($this->file_type == $mime)
                    {
                        return TRUE;
                    }
                }
            }
            else
            
{
                if ($this->file_type == $mimes)
                {
                    return TRUE;
                }
            }
        }                
        return FALSE
;
    } 
r00les
 
Сообщения: 10
Зарегистрирован: 25 мар 2009, 17:43


Вернуться в Баг-репорты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0