Ошибка в uploads

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

Ошибка в uploads

Сообщение MAX » 20 фев 2009, 23:14

Замечательный баг обнаружился. :)

Проблема в том, что загрузить с помощью $CI->upload->do_upload(), файлы кроме $image_types = array('gif', 'jpg', 'jpeg', 'png', 'jpe'); не получится.

Итак, формируем свой

Код: Выделить всё
...
$config['allowed_types'] = 'gif|jpg|png|mp3|txt';
...
$CI->load->library('upload', $config);
...
$res = $CI->upload->do_upload('f_userfile');


При загрузке, скажем txt-файла, вываливается ообщение «Вы пытаетесь загрузить запрещенный тип файла».

Проблема в неверной проверке типа в функции is_allowed_filetype() (файл libraries/Upload.php) вот в этом куске:
Код: Выделить всё
      $image_types = array('gif', 'jpg', 'jpeg', 'png', 'jpe');

      foreach ($this->allowed_types as $val)
      {
         $mime = $this->mimes_types(strtolower($val));

         // Images get some additional checks
         if (in_array($val, $image_types))
         {
            if (getimagesize($this->file_temp) === FALSE)
            {
               return FALSE;
            }
         }


Блок if (in_array($val, $image_types)) ВСЕГДА возвращает FALSE для всех типов, кроме указанных в $image_types: $val - это значение из $this->allowed_types (то, которое в нашем $config). В нашем случае это «gif»(первый элемент). Есно, срабатывает условие «in_array($val, $image_types)» и идет проверка «getimagesize», которое естественно возвращает FALSE - мы же грузим, например txt-файл. А поскольку у нас FALSE, то дальнейший цикл прерывается с «return FALSE».

Исправляется путем указания расширения файла ПЕРЕД картиночными :

Код: Выделить всё
$config['allowed_types'] = 'mp3|txt|gif|jpg|png';


Либо нафиг удалением:

Код: Выделить всё
         // Images get some additional checks
         if (in_array($val, $image_types))
         {
            if (getimagesize($this->file_temp) === FALSE)
            {
               return FALSE;
            }
         }
MAX
 
Сообщения: 63
Зарегистрирован: 08 фев 2009, 13:28

Re: Ошибка в uploads

Сообщение Ozzy » 20 фев 2009, 23:58

Незнаю как у вас но у меня функция выглядит так:

Код: Выделить всё
   /**
    * Verify that the filetype is allowed
    *
    * @access   public
    * @return   bool
    */   
   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;
      }
             
      foreach ($this->allowed_types as $val)
      {
         $mime = $this->mimes_types(strtolower($val));
      
         if (is_array($mime))
         {
            if (in_array($this->file_type, $mime, TRUE))
            {
               return TRUE;
            }
         }
         else
         {
            if ($mime == $this->file_type)
            {
               return TRUE;
            }   
         }      
      }
      
      return FALSE;
   }


скорее всего старая версия CI. И если не ошибаюсь пропускает нормальную загрузку любого из расширений указанных в конфиге.

Я к тому намекаю что вы укажите к какой ветке версий CI данный баг относится.
Только что посмотрел код CI 1.7.1 и таки да, там именно так как написали вы ;)
Аватара пользователя
Ozzy
 
Сообщения: 161
Зарегистрирован: 17 фев 2009, 01:08
Откуда: Одесса

Re: Ошибка в uploads

Сообщение MAX » 21 фев 2009, 00:03

Я до этого работал на 1.6.1, там как раз все ок. С другими не работал. Баг относится к 1.7.1.
MAX
 
Сообщения: 63
Зарегистрирован: 08 фев 2009, 13:28

Re: Ошибка в uploads

Сообщение genzo » 13 авг 2009, 15:32

Также эту ошибку я исправил созданием MY_Upload.php в папке system/applications/libraries
с текстом
Код: Выделить всё
<?php
class MY_Upload extends CI_Upload 
{

    function CI_Upload(){
        parent::CI_Upload();
    }

    function is_allowed_filetype(){
        $file = substr($this->file_ext, 1);
    
        if
(in_array($file, $this->allowed_types)){
            return TRUE;
        }            
        
        return FALSE
;        
    
}    
}
?>
genzo
 
Сообщения: 2
Зарегистрирован: 24 июл 2009, 08:33

Re: Ошибка в uploads

Сообщение felix » 14 фев 2010, 16:28

Пардон, Если в файле uploads ошибка в версии 1,7,1 что мешает заменить файл полностью из версии 1,6,3, в которой, как я понял этой ошибки нет?
Так будет лучше, или же лучше будет скопировать эту библиотеку в application/libraries ?
felix
 
Сообщения: 132
Зарегистрирован: 20 окт 2009, 19:17

Re: Ошибка в uploads

Сообщение skit » 27 ноя 2010, 08:44

О чудо, уже три часа бьюсь и вот оно! Спасибо.
Также эту ошибку и я исправил созданием MY_Upload.php в папке system/applications/libraries
CodeIgniter 1.7.2
skit
 
Сообщения: 25
Зарегистрирован: 05 ноя 2010, 07:38


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

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

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