@efimenko_b

Почему ничего не приходит в массив $_FILES?

Есть форма, данные которой добавляются в БД, а файлы с формы загружаются в папку upload.
Загрузка происходит на ajax.
Но как только форма отправляется, обработчик php возвращает ошибку на проверку пустоты поля с файлом.
Даже при попытке вывести его название, приходит пустая строка.

Если вешать обработчик на форму на прямую, то все работает отлично.
Если через ajax, то $_FILES пустой!

Помогите понять почему.

Сама форма:
<form class="form-horizontal addbook" enctype="multipart/form-data" id="addbookajax" method="post">
					<p class="error-mess alert alert-danger"></p>
					<div class="succ-mess alert alert-dismissible alert-success">
						<button type="button" class="close" data-dismiss="alert">×</button>
						<strong>Очень хорошо!</strong> Книга успешно добавлена
					</div>
					<fieldset>
						<div class="form-group">
							<label for="inputName" class="col-lg-2 control-label">Название</label>
							<div class="col-lg-10">
								<input type="text" class="form-control imp" name="name" id="inputName" placeholder="Название книги">
							</div>
						</div>
						<div class="form-group">
							<label for="inputAuthor" class="col-lg-2 control-label">Автор</label>
							<div class="col-lg-10">
								<input type="text" class="form-control imp" name="author" id="inputAuthor" placeholder="Кто написал книгу">
							</div>
						</div>
						<div class="form-group">
							<label for="inputObl" class="col-lg-2 control-label">Файл обложки</label>
							<div class="col-lg-10">
								<div class="file_upload">
						        	<div class="form-control">Файл не выбран</div>
						        	<button type="button" class="btn btn-info">Обзор...</button>
						        	<input type="file" name="obl" id="inputObl" class="imp">
						    	</div>
							</div>
						</div>
						<div class="form-group">
							<label for="inputBook" class="col-lg-2 control-label">Файл книги</label>
							<div class="col-lg-10">
								<div class="file_upload">
						        	<div class="form-control">Файл не выбран</div>
						        	<button type="button" class="btn btn-info">Обзор...</button>
						        	<input type="file" name="bookfile" id="inputBook" class="imp">
						    	</div>
							</div>
						</div>
						<div class="form-group">
							<div class="col-lg-10 col-lg-offset-2">
								<button type="submit" class="btn btn-primary">Добавить</button>
							</div>
						</div>
					</fieldset>
				</form>


На сабмите весит следующее:
var data = form.serialize();
			$.ajax({
				type: 'POST',
				url: 'addbookinc.php',
				dataType: 'json',
				data: data,
				beforeSend: function(data){
					form.find('button[type="submit"]').width(subW).height(subH).html('<i class="fa fa-spinner fa-spin"></i>');
				},
				success: function(data){
					if (data['error']){
						form.find('.error-mess').text(data['error']).fadeIn();
					}
					else{
						form.find('.error-mess').fadeOut();
						form.find('.succ-mess').fadeIn();
						form.find('input').val('');
					}
				},
				error: function (xhr, ajaxOptions, thrownError) { 
		            alert(xhr.status); 
		            alert(thrownError); 
		         },
				complete: function(data){
					form.find('button[type="submit"]').width('').height('').html('Добавить');
				}         
			});


Ну и сам обработчик который возвращает ошибку, кину хотя бы одну проверку:
if (isset($_POST['name']) and 
		isset($_POST['author']) and 
		isset($_POST['category']) and 
		$_FILES['obl']['size'] > 0 and 
		$_FILES['bookfile']['size'] > 0 and 
		isset($_POST['year']) and 
		isset($_POST['lang']))
	{}
else{
		$json['error'] = 'Заполните все обязательные поля';
    	echo json_encode($json);
    	die();
	}
  • Вопрос задан
  • 1693 просмотра
Решения вопроса 1
Если прочитать внимательно документацию к jQuery.serialize, то мы увидим:
Data from file select elements is not serialized.

Т.е. ваш файл просто не отправляется через ajax, отсюда и пустой $_FILES.
Вам скорее нужно смотреть на работу либо через FormData (stackoverflow.com/questions/5392344/sending-multip...) или, например, воспользоваться плагином jQuery form (malsup.com/jquery/form), который умеет слать формы через ajax даже с файлами.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
FanatPHP
@FanatPHP
Чебуратор тега РНР
проверять надо не name, а error
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы