Я получаю сообщение об ошибке: Тип файла, который вы пытаетесь загрузить, не разрешен, когда я пытаюсь загрузить файл.
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'),
Я слишком долго занимался этим, и это заводило меня с ума! Любые идеи были бы чрезвычайно полезными.
Если вы используете 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. Функция, которую использует класс загрузки, является частью этого расширения.
Если вы не хотите менять системные файлы. Просто попробуйте следующее:
Откройте 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
.
Та же проблема, с которой я столкнулся, когда я пытался загрузить форму загрузки для файлов «.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' ) ); } } }