@kickass77

Как правильно передать переменную через ajax?

Здравствуйте.
У меня есть форма, я собираю данные и хочу обработать их через ajax через GET, но есть переменная, которая ранее отправлялась через POST, поменял алгоритм, но не понимаю, почему через такой принцип не работает.

-----

Здесь привязываю id, чтобы получить данные из input и также загружаю файл:

<label class="contact-lable">Название</label>
<input name="name" id="my_name" class="form-control" type="text" />

<label for="exampleFormControlFile1">Загрузить файл</label>
<input type="file" name="path" class="form-control-file" id="file" accept=" .txt ">


Дальнейшие действия:

<script>
         $(document).ready(function(){
            $("#start_function" ).click(function(){
                // start_function - это id кнопки при которой срабатывает код ниже

                var my_name = $("#my_name").val();
                // получаю данные из input
  
                var files; // переменная будет содержать данные файлов

                // заполняем переменную данными, при изменении значения поля file 
                $('input[type=file]').on('change', function(){
                  files = this.files;
                });
                
                $.ajax({
                    url: "include/ajax.php",
                    cache: false,
                    data: ({type:"upload", my_name:my_name,files:files}),
                    success: function(html){
                        $("#upload_ajax").html(html);
                        alert("ok");
                    }
                });
                return false;
            });
         });
      </script>


Сам файл ajax, где принимаю данные и обрабатываю:

if($_GET['type'] == 'upload') {
		$my_name = $_GET['my_name'];
		$files = $_GET['files'];


		$data = array();
		$error = false;
		$files = array();

		// переместим файлы из временной директории в указанную
		foreach( $_FILES as $file ){
			
    	$uniqdir = "keys";
    	$uniqfile = base_convert(uniqid().rand(0,2000000000), 10, 36);

		$uploaddir = './'.$uniqdir; // . - текущая папка где находится submit.php
    
		// Создадим папку если её нет
		if( ! is_dir( $uploaddir ) ) mkdir( $uploaddir, 0777 );
	
			$type = pathinfo($file['name'], PATHINFO_EXTENSION);
	        $file_name = $uniqfile .'.'. $type;
			
	        if( move_uploaded_file( $file['tmp_name'], "$uploaddir/$file_name" ) ){
	            $files[] = realpath( "$uploaddir/$file_name" );
	        }
	        else{
	            $error = true;
	        }

	        // Здесь я получаю в переменную имя файла, чтобы сохранить
	        $keys_file = $file_name;
    	}
	
	    $data = $error ? array('error' => 'Ошибка загрузки файлов.') : array('files' => $files );
		
		echo json_encode( $data );

		// Сохраняю в базу данных
		$save = R::dispense('data');
        $save->my_name = $my_name;
        $save->keys_file = $keys_file;


      	R::store($save);
	}


Данные из input с id = my_name успешно сохраняются в базе данных.
Алгоритм сохранения файла на сервере также верный - работает, но через POST.
Проблема в том, что переменную files раньше передавал через POST, а сейчас получаю через GET.

Почему данный метод работает для id = my_name, а для files отказывается работать или я где-то допустил ошибку?

Цель: соблюдая подобную структуру для удобства, сохранить данные от my_name и название файла в базу данных, так и загрузить этот файл на сервер.

Помогите разобрать проблему.
Данные из files в файл ajax передаются пустыми.

Спасибо.
  • Вопрос задан
  • 82 просмотра
Пригласить эксперта
Ответы на вопрос 1
@zkrvndm
Боты, парсеры, расширения
Метод GET предполагает передачу данных в адресной строке. Например, при открытии такой ссылки:
https://yousite.ru/include/ajax.php?per1=test&per2=test

Ваш PHP обработчик получит это данные, как $_GET['per1'] и $_GET['per2']

Думаю очевидно, что метод GET может передавать только текст? И при этом размер текста сильно ограничен, так как ссылки физически не могут быть больше 2048 символов.

Если вы хотите отправлять файл именно методом GET, вам нужно файл конвертировать в base64-текст и уже этот текст отправлять, но не как переменную, а непосредственно в теле запроса, при этом контент-тип запроса должен быть plain/text - в теле запроса уже не будет ограничений на объем передаваемой информации.

Однако, не проще ли будет отправлять файл POST-ом, почему вы от него отказались?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы