Codeigniter: ошибка 400 при отправке файла на сервер с использованием Ajax

Я пытаюсь отправить файл (файл типа ввода) на php-сервер с помощью ajax. файл отправляется на контроллер в codeigniter, но я получаю ответ 400 (неверный запрос). Как я могу решить эту проблему?

Вот код:

<form id = "load_file" enctype = "multipart/form-data">
    <fieldset class = "content-group">
    <div class = "form-group">
         <label class = "control-label col-lg-2">Default file input</label>
        <input id = "sortpicture" type = "file" name = "sortpic" />
                <button id = "upload">Upload</button>
    </div>
    </fieldset>
</form>

<script>
$('#upload').on('click', function(e) {
    var base = '<?php echo base_url();?>';
    e.preventDefault();
    var file_data = $('#sortpicture').prop('files')[0];   
    var form_data = new FormData();                  
    form_data.append('file', file_data);
    //alert(form_data);                             
    $.ajax({
        url: 'importa/process', // point to server-side PHP script 
        dataType: 'text',  // what to expect back from the PHP script, if anything
        cache: false,
        contentType: false,
        processData: false,
        data: form_data,                         
        type: 'post',
        success: function(php_script_response){
            alert(php_script_response); // display response from the PHP script, if any
        }
     });
});
</script>

это не проблема пути, потому что, когда я удаляю тип: 'post', он работает, но в контроллере, когда я пытаюсь отобразить имя файла, я получаю сообщение об ошибке undefined index file

консоль baseurl, а затем посмотреть, что у вас есть..

NomanJaved 25.03.2019 04:32

это не проблема пути, потому что когда я удаляю type: 'post' я могу получить доступ к контроллеру

zied123456 25.03.2019 10:14
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
125
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Вместо базового URL используйте site_url()

var site_url = '<?php echo site_url('process/index');?>';

и сейчас

 $.ajax({
    url: site_url,
  ....

Предполагая, что вы включили помощника url в config.php и у вас есть контроллер Process с методом index

это не проблема пути, потому что, когда я удаляю type: 'post' , он работает, но в контроллере, когда я пытаюсь отобразить имя файла, я получаю сообщение об ошибке undefined index file

zied123456 25.03.2019 02:36

Обычно я использую относительный путь с вызовом ajax:

url: '/controller/function'

это не проблема пути, потому что, когда я удаляю type: 'post' , он работает, но в контроллере, когда я пытаюсь отобразить имя файла, я получаю сообщение об ошибке «неопределенный индексный файл»

zied123456 25.03.2019 02:36

Вы видите что-нибудь в своем контроллере с помощью print_r($_POST);die();?

Vickel 25.03.2019 02:40

это пустой массив. похоже, что функция не может перехватить POST

zied123456 25.03.2019 02:45

похоже, вы неправильно отправляете свои данные, вы можете проверить с помощью console.dir(form_data) вместо своего alert(form_data)

Vickel 25.03.2019 03:05

вот результат с console.dir(form_data) FormData прото: FormData append: ƒ append() delete: ƒ delete() entry: ƒ entry() forEach: ƒ forEach() get: ƒ () getAll: ƒ getAll() имеет: ƒ has() ключи: ƒ keys() набор: ƒ () значения: ƒ конструктор values(): ƒ FormData() Symbol(Symbol.iterator): ƒ entry() Symbol(Symbol.toStringTag): «FormData» прото: Объект

zied123456 25.03.2019 03:49

Попробуйте добавить такой файл

Вы можете отдать всю форму FormData() на обработку

var form = $('form')[0]; // You need to use standard javascript object here
var formData = new FormData(form); 

И в контроллере проверьте ввод файла с помощью $_FILES, а не $_GET или $_POST

print_r($_FILES['sortpic']);

я сделал это, но я получаю это сообщение об ошибке: form_data0 is not defined

zied123456 25.03.2019 09:09

Это проблема с URL.

Danish Ali 25.03.2019 13:26

когда я удаляю type: 'post' я могу получить доступ к контроллеру

zied123456 25.03.2019 14:01

Попробуйте указать такой URL-адрес url: "<?= base_url('process')?>" и поставить data: form_data сразу после URL-адреса.

Danish Ali 26.03.2019 05:28

Определите AJAX следующим образом

<script>
$('#upload').on('click', function(e) {
    e.preventDefault();
    var base = '<?php echo base_url();?>';       
    $.ajax({
        url: base + 'process', 
        data:  new FormData(this),
        contentType: false,
        cache: false,
        processData:false,
        type: 'post',
        success: function(response){
            alert(response);
        }
     });
});
</script>

Ваш URL-адрес говорит base + 'process', что означает вашу вызывающую индексную функцию контроллера process. И убедитесь, что ваш базовый URL-адрес в config.php заканчивается косой чертой (/) (https://stackoverflow.com/). Итак, URL должен выглядеть так

https://stackoverflow.com/process <-- Здесь вы не указали имя функции. поэтому убедитесь, что в вашем контроллере добавлена ​​функция index().

Ответ принят как подходящий

это проблема безопасности (защита CSRF в Codeigniter). Мы должны добавить csrf_token к данным перед их отправкой:

form_data.append('csrf_token_name', 'token');

или отключите защиту от CSRF из конфигурационного файла.

Другие вопросы по теме