Загрузка Ajax не работает.

Я использую codeigniter 3.1. Я хочу опубликовать данные загрузки с помощью ajax.

Файл загрузки Ajax не работает. Но когда я отправляю простую форму без ajax, она работает нормально.

Я не знаю, почему, но без ошибок в консоли.

HTML

<?php echo form_open_multipart(site_url("upload/post"), ['id' => 'uploader']) ?> <input type="file" name="userfile" value=""> <input type="submit" value="Submit" /> <?php echo form_close() ?> 

JAVASCRIPT

  $('#uploader').submit(function (event) { event.preventDefault(); $.ajax({ url: window.location.href + '/post', type: "POST", dataType: 'json', data: new FormData(this) }); }); 

КОНТРОЛЛЕРЫ

  public function post() { $this->load->helper('url'); $this->load->helper('form'); $this->load->library("upload"); $file = $this->common->nohtml($this->input->post("userfile")); $this->upload->initialize(array( "upload_path" => 'upload', "overwrite" => FALSE, "max_filename" => 300, "encrypt_name" => TRUE )); $this->upload->do_upload('userfile'); $data = $this->upload->data(); $image_file = $data['file_name']; } 

Одна из проблем заключается в том, что при загрузке файлов используется другой механизм, чем другие формы <input> . Вот почему $this->input->post("userfile") не выполняет эту работу для вас. Другие ответы предложили использовать FormData javascript, и это тоже делает.

HTML

Очень простая форма для выбора файла и отправки его. Обратите внимание на изменение с простой кнопки на <input type="submit"... Это делает намного проще для javascript использовать объект FormData .

Документация FormData

 <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <script src="https://code.jquery.com/jquery-2.2.2.js"></script> <title>Upload Test</title> </head> <body> <?= form_open_multipart("upload/post", ['id' => 'uploader']); ?> <input type="file" name="userfile"> <p> <input type="submit" value="Upload"> </p> <?php echo form_close() ?> <div id="message"></div> <script> $('#uploader').submit(function (event) { event.preventDefault(); $.ajax({ url: window.location.href + '/post', type: "POST", dataType: 'json', data: new FormData(this), processData: false, contentType: false, success: function (data) { console.log(data); if (data.result === true) { $("#message").html("<p>File Upload Succeeded</p>"); } else { $("#message").html("<p>File Upload Failed!</p>"); } $("#message").append(data.message); } }); }); </script> </body> </html> 

JAVASCRIPT

Используйте FormData для захвата полей. Обратите внимание, что вместо обращения к кнопке мы обрабатываем событие отправки.

 $('#uploader').submit(function (event) { event.preventDefault(); $.ajax({ url: window.location.href + '/post', type: "POST", dataType: 'json', data: new FormData(this), processData: false, contentType: false, success: function (data) { //uncomment the next line to log the returned data in the javascript console // console.log(data); if (data.result === true) { $("#message").html("<p>File Upload Succeeded</p>"); } else { $("#message").html("<p>File Upload Failed!</p>"); } $("#message").append(data.message); } }); }); 

КОНТРОЛЛЕР

Я добавил код, который «сообщает» результаты в ajax и отобразит его на странице загрузки.

 class Upload extends CI_Controller { public function __construct() { parent::__construct(); $this->load->helper(['form', 'url']); } public function index() { $this->load->view('upload_v'); } public function post() { $this->load->library("upload"); $this->upload->initialize(array( "upload_path" => './uploads/', 'allowed_types' => 'gif|jpg|png|doc|txt', "overwrite" => FALSE, "max_filename" => 300, "encrypt_name" => TRUE, )); $successful = $this->upload->do_upload('userfile'); if($successful) { $data = $this->upload->data(); $image_file = $data['file_name']; $msg = "<p>File: {$image_file}</p>"; $this->data_models->update($this->data->INFO, array("image" => $image_file)); } else { $msg = $this->upload->display_errors(); } echo json_encode(['result' => $successful, 'message' => $msg]); } } 

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

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

Другим подходом к этому было бы передать PHP файл, закодированный в base64:

  • получить выбранный файл из поля #userfile используя $('#userfile').prop('files')[0] ;
  • преобразуйте содержимое этого файла в строку с кодировкой base64, используя FileReader.readAsDataURL () . Мы собираемся назвать этот content ; Вот аналогичный вопрос, показывающий, как сделать и расширить ответ и возможности;
  • отправить AJAX, передавая как filename и строки content ;
  • теперь на CI, получить данные POST;
  • base64_decode () content ;
  • fwrite () результат в файл, используя filename .

Таким образом, вы могли бы избежать POSTing всех полей формы.

попробуйте это. Опубликовать данные, используя FormData() formdata post file также. Чтобы получить все входные данные формы, включая type="file" вам нужно использовать объект FormData .

 $('#post').on('click', function (e) { var file_data = $("#userfile").prop("files")[0]; var form_data = new FormData(); form_data.append("userfile", file_data) $.ajax({ url: window.location.href+'/post', type: 'POST', data: form_data, async: false, success: function (data) { alert(data) }, cache: false, contentType: false, processData: false }); return false; }); 

Подробнее … https://abandon.ie/notebook/simple-file-uploads-using-jquery-ajax

контроллер

 public function upload() { $this->load->library('upload'); if (isset($_FILES['myfile']) && !empty($_FILES['myfile'])) { if ($_FILES['myfile']['error'] != 4) { // Image file configurations $config['upload_path'] = './upload/'; $config['allowed_types'] = 'jpg|jpeg|png'; $this->upload->initialize($config); $this->upload->do_upload('myfile'); } } } 

Посмотреть

 <form id="myform" action="<?php base_url('controller/method'); ?>" method="post"> <input type="file" name="myfile"> 

 ("#myform").submit(function(evt){ evt.preventDefault(); var url = $(this).attr('action'); var formData = new FormData($(this)[0]); $.ajax({ url: url, type: 'POST', data: formData, processData: false, contentType: false, success: function (res) { console.log(res); }, error: function (error) { console.log(error); } }); // End: $.ajax() }); // End: submit() 

Дайте мне знать, если какой-либо запрос

вам нужно отправить форму не на клик, а на submit … предоставить форму id, а затем отправить submit ajax

HTML

 <?php $attributes = array('id' => 'post'); ?> <?php echo form_open_multipart(site_url("upload/post",$attributes), ?> <input type="file" id="userfile" name="userfile" value=""> <button id="post">Submit</button> <?php echo form_close() ?> 

JAVASCRIPT

$ ('# post'). on ('submit', function () {

  var formData = new FormData(); formData.append("userfile",$("#userfile")[0].files[0]); $.ajax({ url: window.location.href+'/post', type: "POST", data: formData }); 

КОНТРОЛЛЕРЫ

 public function post() { $this->load->library("upload"); $file = $this->common->nohtml($this->input->post("userfile")); $this->upload->initialize(array( "upload_path" => 'upload', "overwrite" => FALSE, "max_filename" => 300, "encrypt_name" => TRUE, )); $data = $this->upload->data(); $image_file = $data['file_name']; $this->data_models->update($this->data->INFO, array( "image" => $image_file ) ); 

}