Загрузка в 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'), 

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

Solutions Collecting From Web of "Загрузка в Codeigniter – тип файла, который вы пытаетесь загрузить, не разрешен"

Если вы используете 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 пытается использовать значение массива, которое не существует.

У меня были те же проблемы с 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!'); } } 

EDIT – предполагается, что вы используете CI 2 (в CI 1 вы можете следить за учебником здесь, чтобы разрешить все типы файлов: http://net.tutsplus.com/tutorials/php/6-codeigniter-hacks-for-the- мастеров / )

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

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

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

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

Это для 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')) вместо: if (function_exists('finfo_file')) . Надеюсь, это может помочь кому-то.

Решение заменяет Upload.php в системе / library / Upload.php CodeIgniter v2.0.3

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

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

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

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

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

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

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

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

В application/config/mimes.php .

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

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

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

Randika

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

новый mimes.php

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

old mimes.php

$ mimes = массив

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

Как только я проследил это, все отлично работало 🙂

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' ) ); } } }