Я пытаюсь загрузить изображение, но он всегда дает мне «Вы не выбрали файл для загрузки».
Мой контроллер
function add() { $thedate=date('Y/n/jh: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); }}
все требования к файлу и разрешения для файлов установлены, но я все еще получаю эту ошибку. может кто-нибудь, пожалуйста, скажите мне, что я делаю неправильно
Параметр функции $this->upload->do_upload()
должен быть именем поля формы. (Если вы вызываете его без параметров, будет использоваться userfile
). Кажется, в вашем случае это должно быть «образ». Вместо:
$image1=$this->input->post('image');
должен быть:
$image1='image';
тег формы должен содержать 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);
если вы получите нулевой массив, убедитесь, что код на стороне клиента верен.
Я полностью согласен с советом о том, чтобы имя элемента файла в форме было либо userfile, либо, если оно отличается, передается методу do_upload. Однако для дальнейшего использования также стоит отметить эту строку:
$image1=$this->input->post('image');
предшествует
if (!$this->upload->do_upload($image1)) {
Я обнаружил, что метод post
класса input
не возвращает ничего до тех пор, пока не будет do_upload
метод do_upload
. Кроме того, вы уже вызвали его в выражении if
поэтому вам не нужно называть его снова в предложении else
. После вызова do_upload
теперь у вас есть доступ к элементам формы с этим сообщением $this->input->post
и информацией о загруженном файле с помощью $this->upload->data()
убедитесь, что вы используете
form_open_multipart ()
если вы используете хелпер формы.
Это слишком знакомая проблема.
Я собираюсь добавить свой ответ в качестве более полного объяснения к другому ответу, который я нашел здесь . Код, который я представляю, не отличается от кода, а скорее добавляет некоторые строки и особенности, не упомянутые в его ответе.
Хотя кажется, что его ответ технически правильный, и, возможно, ответы выше его также верны по-своему, они не работали для меня. Мне пришлось изучить эту проблему, чтобы узнать, что происходит на самом деле, и я достаточно усвоил процесс, чтобы понять, как написать собственное решение.
Прежде всего, обратитесь к комментарию Nana Partykar: «В вашем контроллере я не вижу никакой функции 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, который ваша форма отправляет вашему контроллеру. Но он действительно использует только имя типа input = file из вашей формы. Если вы не укажете имя ввода формы, оно будет по умолчанию равно $ _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'); }
с$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'); }
с$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); }
с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); }
с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); }