Я пытаюсь отправить файл (файл типа ввода) на 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
это не проблема пути, потому что когда я удаляю type: 'post' я могу получить доступ к контроллеру



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вместо базового 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
Обычно я использую относительный путь с вызовом ajax:
url: '/controller/function'
это не проблема пути, потому что, когда я удаляю type: 'post' , он работает, но в контроллере, когда я пытаюсь отобразить имя файла, я получаю сообщение об ошибке «неопределенный индексный файл»
Вы видите что-нибудь в своем контроллере с помощью print_r($_POST);die();?
это пустой массив. похоже, что функция не может перехватить POST
похоже, вы неправильно отправляете свои данные, вы можете проверить с помощью console.dir(form_data) вместо своего alert(form_data)
вот результат с 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» прото: Объект
Попробуйте добавить такой файл
Вы можете отдать всю форму 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
Это проблема с URL.
когда я удаляю type: 'post' я могу получить доступ к контроллеру
Попробуйте указать такой URL-адрес url: "<?= base_url('process')?>" и поставить data: form_data сразу после URL-адреса.
Определите 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 из конфигурационного файла.
консоль baseurl, а затем посмотреть, что у вас есть..