Загрузка в Codeigniter - тип файла, который вы пытаетесь загрузить, не разрешен

Я получаю сообщение об ошибке: Тип файла, который вы пытаетесь загрузить, не разрешен, когда я пытаюсь загрузить файл.

if(!empty($_FILES['proof_of_purchase']['name'])) {
    $config['upload_path'] = './uploads/invoices/';
    $config['allowed_types'] = 'gif|jpg|jpeg|png|pdf|bmp';
    $config['max_size'] = '3000';
    $this->load->library('upload', $config);

      // if there was an error, return and display it
    if (!$this->upload->do_upload('proof_of_purchase'))
    {
        $data['error'] = $this->upload->display_errors();
        $data['include'] = 'pages/classic-register';
    } else {
        $data['upload_data'] = $this->upload->data();
        $filename = $data['upload_data']['file_name'];
    }
}

Я пробовал много разных файлов - в основном gif и jpeg, и каждый раз получал одну и ту же ошибку.

var_dump ($ _ FILES); дает мне:

array(1) { ["proof_of_purchase"]=> array(5) { ["name"]=> string(28) "2010-12-04_00019.jpg" ["type"]=> string(10) "image/jpeg" ["tmp_name"]=> string(19) "D:\temp\php2BAE.tmp" ["error"]=> int(0) ["size"]=> int(58054) } } 

Я проверил mime config, и он содержит правильные вещи. Пример:

'jpeg'  =>  array('image/jpeg', 'image/pjpeg'),
'jpg'   =>  array('image/jpeg', 'image/pjpeg'),
'jpe'   =>  array('image/jpeg', 'image/pjpeg'),

Я слишком долго потратил на это, и это заставило меня с ума! Любые идеи были бы чрезвычайно полезными.

Ответы

Ответ 1

Если вы используете Codeigniter версии 2.1.0, в библиотеке загрузки есть ошибка. Подробнее см. http://codeigniter.com/forums/viewthread/204725/.

В основном то, что я сделал, это изменить несколько строк кода в классе загрузки файлов (Location:./system/libraries/Upload.php)

1) изменить номер строки 1044

от

$this->file_type = @mime_content_type($file['tmp_name']);
return;

:

$this->file_type = @mime_content_type($file['tmp_name']);
if (strlen($this->file_type) > 0) return; 

2) изменить номер строки 1058

от

@exec('file --brief --mime-type ' . escapeshellarg($file['tmp_path']), $output, $return_code);

:

@exec('file --brief --mime-type ' . escapeshellarg($file['tmp_name']), $output, $return_code); 

Как вы можете видеть, строка 1058 пытается использовать значение массива, которое не существует.

Ответ 2

У меня были те же проблемы с CI и я не смог найти исправление на форумах или через google. Я сделал это, чтобы разрешить все типы файлов, чтобы файл загружался. Затем я обрабатываю логику вручную, чтобы определить, разрешать/сохранять файл или удалять его и сообщать пользователю, что тип файла не разрешен.

$config['upload_path'] = './uploads/invoices/';
$config['allowed_types'] = '*'; // add the asterisk instead of extensions
$config['max_size'] = '3000';
$this->load->library('upload', $config);

if (!$this->upload->do_upload('proof_of_purchase'))
{
    $data['error'] = $this->upload->display_errors();
    $data['include'] = 'pages/classic-register';
} else {
    $data['upload_data'] = $this->upload->data();
    // use custom function to determine if filetype is allowed
    if (allow_file_type($data['upload_data']['file_ext'])) 
    {
        $filename = $data['upload_data']['file_name'];
    }
    else
    {
        show_error('File type is not allowed!');
    }
}

РЕДАКТИРОВАТЬ. Предполагается, что вы используете CI 2 (в CI 1 вы можете следить за учебником здесь, чтобы разрешить все типы файлов: http://net.tutsplus.com/tutorials/php/6-codeigniter-hacks-for-the-masters/)

Ответ 3

Что я сделал, так это создать свою собственную библиотеку "MY_Upload", чтобы расширить класс CI_Upload, а затем просто скопировал класс CI_Upload и применил изменения, изложенные Адамом (спасибо BUT BTW для решения) в моей пользовательской библиотеке.

Это позволяет мне использовать стандартный синтаксис CI и избегать взлома исходных файлов! Моя библиотека автоматически используется, потому что она просто "расширяет" оригинал, это абсолютно безболезненное решение и не прерывается, если по какой-то причине вы должны заменить исходные файлы.

PS: Я делаю это с классом Logging также, когда хочу генерировать собственные журналы.

Ответ 4

У меня была такая же проблема. Возможно, вам потребуется проверить, распознает ли приложение тип файла загружаемого файла. Добавив новый тип mimetype в config/mimes.php, исправлена ​​проблема.: -)

Ответ 5

Это для версии Codeigniter 2.2. Если этот вопрос все еще имеет значение. Я проследил ошибку в файловой системе/библиотеках/файле upload.php для функции: protected function _file_mime_type($file) в строке 1032 и строке 1046: $this->file_type = $matches[1]; Когда я загружал файл с расширением .txt, оператор в строке 1046, по-видимому, присваивал неверное значение 'text/x-asm' - $this->file_type, которое позже сравнивается с 'text/plain', и поскольку типы mime не соответствуют тесту, и сигнализирует неправильный тип файла и сообщение об ошибке:

'Тип файла, который вы пытаетесь загрузить, не разрешен

Решение, не уверенное, но быстрое исправление, которое работает, изменит условие строки 1032 на NOT так, чтобы оно читалось: if (!function_exists('finfo_file')) вместо: if (function_exists('finfo_file')). Надеюсь, это поможет кому-то.

Ответ 6

Решение заменяет Upload.php в системе/библиотеках/Upload.php CodeIgniter v2.0.3

Ответ 7

Эта проблема вызвана отсутствием расширения PHP FileInfo. Функция, которую использует класс загрузки, является частью этого расширения.

http://www.php.net/manual/en/ref.fileinfo.php

Ответ 8

Если вы не хотите менять системные файлы. Просто попробуйте следующее:

  • Откройте system/libraries/Upload.php (метод do_upload() строка 205) и сделайте это

    var_dump($this->file_type);
    exit();
    
  • Попробуйте загрузить файл.

  • Добавьте тип файла, который вы видите в var_dump() - application/config/mimes.php.

Маленький пример: у вас проблема с .docx. Попробуйте добавить:

'docx' => array('application/zip', 'application/msword', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document')

В application/config/mimes.php.

Ответ 9

Те же проблемы, с которыми я столкнулся, когда я пытался загрузить форму загрузки для загрузки, Файлы ".xlsx", которые в файле CodeIgniter mimes.php имеют запись в этом массиве, представляют собой расширения файлов "xlsx".

Итак, здесь, в следующей ссылке, я описал, что действительно нужно, чтобы решить эту проблему и выяснить решение!

С наилучшими пожеланиями,

Randika

Ответ 10

Возможно, стоит проверить, что у вас установлена ​​последняя версия приложения /config/mimes.php, вместо того, чтобы устанавливать переменную $mimes, теперь она просто возвращает массив.

new mimes.php

возвращаемый массив

old mimes.php

$mimes = array

Если у вас все еще есть старая версия mimes.php, функция Common.php & get_mimes() возвращает пустой массив. Это имеет эффект knockon взлома Upload.php

Как только я проследил это, все работало нормально:)

Ответ 11

1) Разрешить все типы файлов. 2) Вручную установите правило проверки с традиционным php, чтобы принять или отклонить типы файлов. 3) если соблюдаются правила валидации, затем загрузите с помощью помощника загрузки CI.

if (isset($_FILES['upload_file']) && !empty($_FILES['upload_file'] ['name'])) {
        $file_name=$_FILES['upload_file'] ['name'];
        $acceptedext=array("zip","pdf","png","jpg","jpeg");
        $a=(explode('.', $file_name));
        $b=end($a);
        $file_ext=strtolower($b);

        if (!in_array($file_ext, $acceptedext)) {
            $this->session->set_flashdata( 'flash_message_error', "file format not accepted!" );
            redirect( base_url( 'page' ) );
        }
        else{
            $config['upload_path'] = './uploads/';
            $config['allowed_types'] = '*';


            $this->load->library('upload');
            $this->upload->initialize($config);

            if (!$this->upload->do_upload('upload_file')) {

                $error = $this->upload->display_errors('', ' ');
                $this->session->set_flashdata( 'flash_message_error', $error );
                redirect( base_url( 'page' ) );
            } } }