"не выбрал файл для загрузки" при загрузке с использованием codeigniter - PullRequest
7 голосов
/ 17 сентября 2011

я пытаюсь загрузить изображение, но оно всегда дает мне сообщение «Вы не выбрали файл для загрузки».

Мой контроллер

function add()
{

        $thedate=date('Y/n/j h:i:s');
        $replace = array(":"," ","/");
        $newname=str_ireplace($replace, "-", $thedate);

        $config['upload_path'] = './upload/';
        $config['allowed_types'] = 'gif|jpg|png|jpeg';
        $config['file_name']=$newname;
        $config['max_size'] = '100';
        $config['max_width']  = '1024';
        $config['max_height']  = '768';

        $this->load->library('upload', $config);
        //$this->upload->initialize($config);
        $this->load->library('form_validation');

        $this->form_validation->set_rules('title','title','trim|required');
        $this->form_validation->set_rules('description','Description','trim|required');
        $image1=$this->input->post('image');


     if ($this->form_validation->run()==FALSE){

            $this->addview();   

            return false;

        }


      if (!$this->upload->do_upload($image1)) {

        $error = array('error' => $this->upload->display_errors());
        $this->load->view('upload_error', $error);


         }

       else {
        $mage=$this->upload->do_upload($image1);

            $data =array(
            'title'=>$this->input->post('title'),
            'descrip'=>$this->input->post('description'),

            'image' => $mage['file_name']

    );  


            $this->load->model('member_functions');

            $q=$this->member_functions->insert($data);
    }}

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

Ответы [ 5 ]

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

Параметр для $this->upload->do_upload() функция должна быть именем поля формы. (Если вы называете это без параметров userfile будет использоваться). Кажется, в вашем случае это должно быть «изображение». Вместо:

$image1=$this->input->post('image');

должно быть:

$image1='image';
6 голосов
/ 15 августа 2012
  • Просмотр страницы

тег формы должен содержать enctype="multipart/form-data".
, т. Е. <form action='' method=''enctype="multipart/form-data> <input type='file' name='field_name'/>

  • контроллер

и в контроллере код загрузки должен быть $this->upload->do_upload("field_name")
, и jsut проверяет, достигает ли файл на стороне сервера, просто печатая как

print_r($_FILES);

, если вы получаете нулевой массив, тогда убедитесь, что код на стороне клиентаправильно.

1 голос
/ 28 июня 2013

убедитесь, что вы используете

form_open_multipart ()

, если вы используете помощник формы.

1 голос
/ 26 января 2012

Я полностью согласен с рекомендацией убедиться, что имя элемента файла в форме либо userfile, либо, если отличается, передается методу do_upload.Тем не менее, для дальнейшего использования также стоит отметить эту строку:

$image1=$this->input->post('image');

предшествует

if (!$this->upload->do_upload($image1)) {

Я обнаружил, что метод post класса input ничего не возвращает, покапосле вызова метода do_upload.Кроме того, вы уже вызвали его в операторе if, поэтому вам не нужно вызывать его снова в предложении else.После вызова do_upload у вас теперь есть доступ к элементам формы с помощью $this->input->post и информации о загруженном файле с помощью $this->upload->data()

0 голосов
/ 10 февраля 2017

Это слишком знакомая проблема.

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

Даже если кажется, что его ответ технически правильный, и, возможно, ответы выше его также правильны впо-своему, они не работали для меня.Мне пришлось изучить эту проблему, чтобы выяснить, что на самом деле происходит, и я достаточно узнал о процессе, чтобы понять, как написать свое собственное решение.

Прежде всего, обратитесь к комментарию Наны Партикар: «В вашемконтроллер, я не могу увидеть функцию is_uploaded_file ()? "Этот комментарий говорит нам, что люди неправильно понимают два файла с одинаковыми именами, но разные.Я знаю, потому что некоторое время я думал, что они должны ссылаться на один и тот же файл, файл контроллера (названный «Uploader.php»).Я вижу, что почти все эти вопросы относятся к одному и тому же учебнику «Как загрузить несколько файлов с помощью Ajax» где-то там, включая мою собственную версию.Код, который мы все используем, точно такой же.

Но файл контроллера - «Uploader.php».Где вы видите $ this-> upload-> do_upload () или $ this-> upload-> do_upload ('userfile') или даже $ this-> upload-> do_upload ('files'), это относится к системе /файл модуля библиотеки с именем «Upload.php».Обратите внимание, что перед вызовом функции do_upload () вы должны вызвать следующую строку: $ this-> load-> library ('upload', $ config);

Sachin Marwha дал нам цикл for, который зацикливаетсячерез массив $ _FILES ['userfile'].Допустим, вы загрузили три картинки.Каждый элемент $ _FILES ['userfile'] сам состоит из 5 "свойств": name, type, tmp_name, error, size.Вы можете увидеть эти свойства $ _FILE на PHP .

Вы хотите передать только один файл за один раз в do_upload ().Вы не хотите передавать все три (или даже 20) файла одновременно в do_upload.Это означает, что вы должны разбить массив $ _FILES ['userfile'] на отдельные файлы перед вызовом do_upload ().Для этого я делаю элемент $ _FILES ['f'] из массива $ _FILES.Я понял это, установив точки останова в файле system / library / Upload.php, в функции do_upload ($ file = 'userfile'), чтобы увидеть, где я получал печально известный «не выбрал файл для загрузки», который каждый(включая меня) продолжает жаловаться.Эта функция, как вы обнаружите, использует исходный массив $ _FILES, который ваша форма отправляет вашему контроллеру.Но на самом деле он использует только имя типа ввода = файл из вашей формы.Если вы не укажете имя для ввода формы, по умолчанию это будет $ _FILES ['userfile'].Как оказалось, это была моя самая большая проблема, потому что, если бы я использовал имя моего поля ввода, то это поле передавало массив или коллекцию файлов, а не только один файл.Поэтому мне пришлось создать специальный элемент $ _FILES ['f] и ТОЛЬКО передать $ _FILES [' f '].

Вот как я это делаю, и, поверьте мне, я перепробовал все версиина этой странице и других, не только один StackOverflow, но и другие учебные пособия:

    $cpt = count($_FILES['userfile']['name']);
    for($i=0; $i < $cpt; $i++)
    {
        unset($config);
        $config = array();
        $config['upload_path']   = $path;
        $config['allowed_types'] = 'gif|jpg|png';
        $config['max_size'] = '1000';
        $config['overwrite'] = TRUE;
        $config['remove_spaces'] = FALSE;
        $config['file_name'] = $_FILES['userfile']['name'][$i];

        // Create a new 'f' element of the $_FILES object, and assign the name, type, tmp_name, error, and size properties to the corresponding 'userfile' of this iteration of the FOR loop.
        $_FILES['f']['name'] =  $_FILES['userfile']['name'][$i];
        $_FILES['f']['type'] = $_FILES['userfile']['type'][$i];
        $_FILES['f']['tmp_name'] = $_FILES['userfile']['tmp_name'][$i];
        $_FILES['f']['error'] = $_FILES['userfile']['error'][$i];
        $_FILES['f']['size'] = $_FILES['userfile']['size'][$i];

        $this->load->library('upload', $config);
        $this->upload->initialize($config);            
        if (! $this->upload->do_upload('f'))
        {
            $data['errors'] = $this->upload->display_errors();
        }
        else
        {
            $data['errors'] = "SUCCESS";
        }

        unset($config);
        $config = array();
        $config['image_library']    = 'gd2';
        $config['source_image']     = $path . $_FILES['userfile']['name'][$i];
        $config['create_thumb']     = TRUE;
        $config['maintain_ratio']   = TRUE;
        $config['thumb_marker']     = '.thumb';
        $config['width']            = 100;
        $config['height']           = 100;

        $this->load->library('image_lib', $config);
        $this->image_lib->clear();
        $this->image_lib->initialize($config);
        $this->image_lib->resize();
        $types = array('.jpg');
    }        

Где он сбрасывает массив $ config в цикле for i, а затем переделывает массив $ config, эточасть, которая создает эскизы изображений для каждого файла изображения.

Полная функция загрузки контроллера:

    public function upload_asset_photo()
    {
        $data = array();
        $dateArray = explode("/",$this->input->post('date'));
        $date = $dateArray[2] . "/" . $dateArray[0] . "/" . $dateArray[1]; // year/month/day
        $cid = $this->config->item('cid'); // this is a special company id I use, unnecessary to you guys.
        $padded_as_id = sprintf("%010d", $this->uri->segment(3)); // this makes an "asset id" like "3" into "0000000003"
        $path = 'properties_/' . $padded_as_id . '/' . $date . '/'; // file path
        if (!is_dir($path)) {
            mkdir($path,0755,true); //makes the ile path, if it doesn't exist
        }

        $cpt = count($_FILES['userfile']['name']);
        for($i=0; $i < $cpt; $i++)
        {
            unset($config);
            $config = array();
            $config['upload_path']   = $path;
            $config['allowed_types'] = 'gif|jpg|png';
            $config['max_size'] = '1000';
            $config['overwrite'] = TRUE;
            $config['remove_spaces'] = FALSE;
            $config['file_name'] = $_FILES['userfile']['name'][$i];

            $_FILES['f']['name'] =  $_FILES['userfile']['name'][$i];
            $_FILES['f']['type'] = $_FILES['userfile']['type'][$i];
            $_FILES['f']['tmp_name'] = $_FILES['userfile']['tmp_name'][$i];
            $_FILES['f']['error'] = $_FILES['userfile']['error'][$i];
            $_FILES['f']['size'] = $_FILES['userfile']['size'][$i];

            $this->load->library('upload', $config);
            $this->upload->initialize($config);            
            if (! $this->upload->do_upload('f'))
            {
                $data['errors'] = $this->upload->display_errors();
            }
            else
            {
                $data['errors'] = "SUCCESS";
            }

            unset($config);
            $config = array();
            $config['image_library']    = 'gd2';
            $config['source_image']     = $path . $_FILES['userfile']['name'][$i];
            $config['create_thumb']     = TRUE;
            $config['maintain_ratio']   = TRUE;
            $config['thumb_marker']     = '.thumb';
            $config['width']            = 100;
            $config['height']           = 100;

            $this->load->library('image_lib', $config);
            $this->image_lib->clear();
            $this->image_lib->initialize($config);
            $this->image_lib->resize();
            $types = array('.jpg');
        }        

        header('Content-Type: application/json');
        echo json_encode($data);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...