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