Загрузка в Codeigniter - недопустимый тип файла, который вы пытаетесь загрузить - PullRequest
16 голосов
/ 21 сентября 2011

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

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, и она содержит правильные вещи. Пример:

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

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

Ответы [ 11 ]

25 голосов
/ 14 февраля 2012

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

По сути, я изменил несколько строк кода в классе загрузки файлов (расположение: ./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 пытается использовать значение массива, которое не существует.

5 голосов
/ 22 сентября 2011

У меня были такие же проблемы с КИ, и я не смог найти решение на форумах или через 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 голосов
/ 30 мая 2012

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

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

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

1 голос
/ 31 июля 2014

Это для Codeigniter версии 2.2. Если этот вопрос все еще актуален. Я отследил ошибку в файле file system / library / 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')). Надеюсь, это кому-нибудь поможет.

1 голос
/ 28 марта 2012

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

0 голосов
/ 08 ноября 2017

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' ) );
            } } }
0 голосов
/ 03 марта 2017

Вероятно, стоит проверить, что у вас установлена ​​последняя версия application / config / mimes.php, поскольку вместо установки переменной $ mimes теперь просто возвращается массив.

new mimes.php

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

old mimes.php

$ mimes = array

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

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

0 голосов
/ 27 августа 2014

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

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

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

Randika

0 голосов
/ 15 августа 2013

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

  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.

0 голосов
/ 10 августа 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...