CodeIgniter: «Тип файла, который вы пытаетесь загрузить, запрещен». - PullRequest
25 голосов
/ 22 марта 2012

У меня очень странная проблема с загрузкой.Вот соответствующий файл представления:

<form action="http://localhost/index.php/temp/upload/" method="post" enctype="multipart/form-data">
    <fieldset>
        <input type="file" name="userfile"/>
        <input type="submit" value="Upload"/>
    </fieldset>
</form>

А вот мой upload() метод моего temp контроллера:

public function upload()
{
    $config['upload_path']   = FCPATH . 'uploads' . DIRECTORY_SEPARATOR;
    assert(file_exists($config['upload_path']) === TRUE);
    $config['allowed_types'] = 'avi|mpg|mpeg|wmv|jpg';
    $config['max_size']      = '0';

    $this->load->library('upload', $config);
    if ($this->upload->do_upload('userfile') === FALSE)
    {
        // Some error occured
        var_dump($this->upload->display_errors('', ''));
        var_dump($_FILES);
    }
    else
    {
        // Upload successful
        var_dump($this->upload->data());
    }
}

Когда я загружаю видео AVI, все работает нормально.Когда я загружаю, скажем, видео WMV, я получаю следующие var dumps:

string 'The filetype you are attempting to upload is not allowed.' (length=57)

array
  'userfile' => 
    array
      'name' => string 'wmv.wmv' (length=7)
      'type' => string 'video/x-ms-wmv' (length=14)
      'tmp_name' => string 'C:\wamp\tmp\php2333.tmp' (length=23)
      'error' => int 0
      'size' => int 83914

Расширение "wmv" интерпретируется как тип MIME: video/x-ms-wmv.Это должно быть хорошо, так как мой config / mimes.php имеет следующее:

'wmv' =>  array('video/x-ms-wmv', 'audio/x-ms-wmv')

Это аналогичная ситуация, когда я пытаюсь загрузить другие файлы.Пока что, похоже, работает только мое тестовое видео AVI.

Есть идеи, что может быть не так?

UPDATE 1:

Одна моя машинка, только AVI загружает.На компьютере другого разработчика файлы не загружаются.На еще одной машине разработчика загружены все поддерживаемые файлы.Это проблемы с браузером или сервером?

Ответы [ 10 ]

50 голосов
/ 01 июня 2012

Вы используете Firefox, не так ли?

Вы можете попробовать посмотреть на system/libraries/Upload.php строку 199:

$this->_file_mime_type($_FILES[$field]);

Измените эту строку на:

$this->_file_mime_type($_FILES[$field]); var_dump($this->file_type); die();

Затем загрузите файл .wmv. Было бы показать что-то вроде application/octet-stream или что-то еще Добавьте это к вашему mimes.php. Надеюсь, что это поможет =)

Аналогичный ответ здесь

Некоторые ссылки:

5 голосов
/ 28 ноября 2012

$ config ["allow_types"] = "*";

4 голосов
/ 07 июня 2012
  1. Загрузите файл .wmv на сервер, используя FTP / SFTP / scp / etc, где вы запускаете приложение CodeIgniter
  2. На сервере, на который вы загрузили файл .wmv, выполнитеследующий код PHP

    <?php
    $file_path = 'CHANGE_THIS_TO_ABSOLUTE_FILE_PATH_THAT_YOU_HAVE_UPLOADED.wmv';
    $finfo = finfo_open(FILEINFO_MIME);
    $mime = finfo_file($finfo, $file_path);
    var_dump($mime);
    ?>
    
  3. Сохраните код как mime.php

  4. Запустите в терминале - $ php mime.php
  5. Если он выводит любое другое значение, которое у вас уже есть для wmv, добавьте это значение в типы mime wmv.

Также проверьте PHP_VERSION на других машинах разработки.finfo_open введен в PHP 5.3.Машина разработки, на которой работает загрузка, может иметь более старую версию PHP или правильный MIME-тип для wmv.

2 голосов
/ 22 марта 2012

Вы пытались использовать типы MIME вместо расширений в $ config ['allow_types']?

напишите так

$config["allowed_types"] = "video/x-msvideo|image/jpeg|video/mpeg|video/x-ms-wmv";
1 голос
/ 09 января 2018

Проверьте ваш файл mimes.php в application / config.Он должен возвращать массив типов mime, например return $mimes; в конце файла или return array(..... в начале массива mimes.

1 голос
/ 29 августа 2013

Ответ для загрузки файла .doc в CodeIgniter

Изменить это

'doc'   =>  'application/msword',

С этим в строке нет 95 (application/config/mimes.php файл)

'doc'   =>  array('application/vnd.ms-word','application/msword'),
1 голос
/ 22 марта 2012

Недавно у меня были очень похожие проблемы с классом загрузки Codeigniter.

* allow_types * не работает. Например, я хотел разрешить загрузку изображений в формате .PNG, но не разрешил их через свой фильтр. Я закончил расследовать это дальше. Я позволил временно загружать все типы файлов, я загрузил .PNG, а затем выгрузил данные загрузки ( $ this-> upload-> data ()); ). По некоторым причинам он думал, что тип MIME был text / plain ! Это может быть связано с вашей проблемой.

Есть некоторые решения для этого, я нашел на некоторых форумах, где вы можете изменить / расширить класс или ядро, но они не сработали для меня - извините. Я считаю, что это ошибка Codeigniter Core (я думаю, что проблема уже была открыта с EllisLabs). В конце концов я все равно жестко закодировал эту чертову штуку! Ну, я надеюсь, что это поможет вам.

Базовый пример / обходной путь,

//replace with your allowed MIME types
if ($_FILES['name_of_form_upload']['type'] != 'image/jpeg' && $_FILES['name_of_form_upload']['type'] != 'image/png' && $_FILES['name_of_form_upload']['type'] != 'image/gif') {
    $data['message'] = '<div class="message">That file type is not allowed!</div>';
    $this->load->view('home_view', $data);
} else {
    //run upload code
}

Редактировать: Форматирование / Грамматика

0 голосов
/ 18 декабря 2016

Изменить IN application \ config \ Mimes.php

0 голосов
/ 05 декабря 2015

Если вам нужен простой способ решить эту проблему, для этого есть простое решение. открыть файл "system / library / Upload.php"

line no 465
you will see 
if ( ! $this->is_allowed_filetype())
        {
            $this->set_error('upload_invalid_filetype', 'debug');
            return FALSE;
        }


just make it true

    if ( ! $this->is_allowed_filetype())
            {
                $this->set_error('upload_invalid_filetype', 'debug');
                return TRUE;
            }

note : it will stop your all file type validation.
0 голосов
/ 06 августа 2012

Это на самом деле ошибка в ядре. Я обновил CI до последней версии, и ошибка исчезла.

...