Ошибка при передаче файла через AJAX

92
08 октября 2021, 12:50

Локалхост, передаю файл через AJAX-запрос. Массивы создаются и передаются в php файл, но про попытке разобрать всё на переменные получаю ошибку cервера 500. Как я понимаю, дело совсем не в сервере, а что-то не так в том файле-получателе. Пока пердавал только строковые было всё в порядке. Проверил валидатором синтаксис, ошибок нет. Вот файл-получатель add_project.php:

<?php 
 
	$title = $_POST['title']; 
	$description = $_POST['description']; 
	$file = $_FILES['fileToUpload']; 
 
	$fileName = $_FILES['fileToUpload']['name']; 
	$fileTmpName = $_FILES['fileToUpload']['tmp_name']; 
	$fileSize = $_FILES['fileToUpload']['size']; 
	$fileError = $_FILES['fileToUpload']['error']; 
	$fileType = $_FILES['fileToUpload']['type']; 
 
	$fileExt = explode('.', $fileName); 
	$fileActualExt = strtolower(end($fileExt)); 
 
	$allowed = $array('png', 'jpg', 'jpeg'); 
 
	$error = ''; 
	if(strlen($title) <= 3) 
		$error = 'Введите название';  
	else if (strlen($description) <= 5) 
		$error = 'Введите описание'; 
	else if (in_array($fileActualExt, $allowed)){ 
		if ($fileError === 0){ 
			if ($fileSize < 5000){ 
				$fileNameNew = uniqid('', true).".".$fileActualExt; 
				$fileDestination = 'uploads/'.$fileNameNew; 
				move_uploaded_file($fileTmpName, $fileDestination); 
			 }  else { 
			 	$error = 'Файл не должен превышать 5Мб'; 
			 	} 
		} else	{ 
			$error = 'Принимаются изображения только в 	форматах png, jpg, jpeg'; 
			} 
	} else { 
		$error = 'Принимаются изображения только в форматах png, jpg, jpeg'; 
		} 
 
	if($error != ''){ 
		echo $error; 
		exit(); 
	} 
 
	require_once '../mysql_connect.php'; 
 
	$sql = 'INSERT INTO project(title, description, text, date, author) VALUES (?,?,?,?,?)'; 
	$query = $pdo->prepare($sql); 
	$query->execute([$title, $description, $fileDestination, time(), $_COOKIE['log']]); 
 
	echo 'Готово'; 
?> 

Форма и AJAX запрос:

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> 
<form id="data" method="post" enctype="multipart/form-data"> 
				  <label for="title">Название</label> 
				  <input type="text" name="title" id="title" class="form-control"><br> 
				  <label for="description">Описание</label> 
				  <textarea name="description" id="description" class="form-control"></textarea><br> 
 
				  <label for="file" class="mt-5">Добавьте изображения</label> 
				  <input type="file" name="fileToUpload" id="fileToUpload"><br> 
 
				  <div class="alert alert-danger mt-2" id="errorBlock"></div><br> 
 
				  <button type="submit" id="send_prjct" class="btn btn-dark mt-3">Добавить</button> 
</form> 
 
<script> 
		$("#data").submit(function(e) { 
            e.preventDefault();     
            var formData = new FormData(this); 
 
			 
			$.ajax({ 
				url: 'ajax/add_project.php', 
				type: 'POST', 
				data: formData, 
				 dataType: 'json', 
				cache: false, 
				contentType: false, 
				processData: false, 
				success: function(data) { 
					if (data == 'Готово'){ 
						$('#send_prjct').text('Выполнено'); 
						$('#errorBlock').hide(); 
					} else { 
						$('#errorBlock').show(); 
						$('#errorBlock').text(data); 
					} 
				}		 
			}); 
		});		 
	</script>

Answer 1

Рабочий вариант:

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form id="data" method="post" enctype="multipart/form-data">
    <label for="title">Название</label>
    <input type="text" name="title" id="title" class="form-control"><br>
    <label for="description">Описание</label>
    <textarea name="description" id="description" class="form-control"></textarea><br>
    <label for="file" class="mt-5">Добавьте изображения</label>
    <input type="file" name="fileToUpload" id="fileToUpload"><br>
    <div class="alert alert-danger mt-2" id="errorBlock"></div><br>
    <button type="submit" id="send_prjct" class="btn btn-dark mt-3">Добавить</button>
</form>
<script>
        $("#data").submit(function(e) {
            e.preventDefault();    
            var formData = new FormData(this);    
            $.ajax({
                url: 'add_project.php', // Путь для теста изменен
                type: 'POST',
                data: formData,
                 //dataType: 'json',//******** это лишнее
                cache: false,
                contentType: false,
                processData: false,
                success: function(data) {
                    if (data == 'Готово'){
                        $('#send_prjct').text('Выполнено');
                        $('#errorBlock').hide();
                    } else {
                        $('#errorBlock').show();
                        $('#errorBlock').text(data);
                    }
                }       
            });
        });     
    </script>

Файл add_project.php (путь изменен для теста)

<?php
    $title = $_POST['title'];
    $description = $_POST['description'];
    $file = $_FILES['fileToUpload']; // а что здесь? - это массив
    $fileName = $_FILES['fileToUpload']['name'];
    $fileTmpName = $_FILES['fileToUpload']['tmp_name'];
    $fileSize = $_FILES['fileToUpload']['size'];
    $fileError = $_FILES['fileToUpload']['error'];
    $fileType = $_FILES['fileToUpload']['type'];
    $fileExt = explode('.', $fileName);
    $fileActualExt = strtolower(end($fileExt));
    $allowed = array('png', 'jpg', 'jpeg');// тут знак переменной убран
    $error = '';
    if(strlen($title) <= 3)
        $error = 'Введите название'; 
    else if (strlen($description) <= 5)
        $error = 'Введите описание';
    else if (in_array($fileActualExt, $allowed)){
        if ($fileError === 0){
            if ($fileSize < 5000){
                $fileNameNew = uniqid('', true).".".$fileActualExt;
                $fileDestination = 'uploads/'.$fileNameNew;
                move_uploaded_file($fileTmpName, $fileDestination);
             }  else {
                $error = 'Файл не должен превышать 5Мб';
                }
        } else  {
            $error = 'Принимаются изображения только в  форматах png, jpg, jpeg';
            }
    } else {
        $error = 'Принимаются изображения только в форматах png, jpg, jpeg';
        }
    if($error != ''){
        echo $error;
        exit();
    }
    // Это для теста отключено
    /*require_once '../mysql_connect.php';
    $sql = 'INSERT INTO project(title, description, text, date, author) VALUES (?,?,?,?,?)';
    $query = $pdo->prepare($sql);
    $query->execute([$title, $description, $fileDestination, time(), $_COOKIE['log']]);*/
    echo 'Готово';
?> 
READ ALSO
Bitrix — почему не выгружаются дополнительные свойства?

Bitrix — почему не выгружаются дополнительные свойства?

В программе 1с, создал дополнительные свойства, в которых указываю старую цену и скидкуВ bitrix в админке создал данные дополнительные свойства...

118
Здравствуйте! Проблема с PHP, JS и YandexApi!

Здравствуйте! Проблема с PHP, JS и YandexApi!

Нужно какая-либо идея реализации получения расстояния между 2 адресами по дорогам, используя API Яндекса (док-ию почитал, знаю что и как брать...

112
Мультипоточный парсер [закрыт]

Мультипоточный парсер [закрыт]

Хотите улучшить этот вопрос? Переформулируйте вопрос так, чтобы он был сосредоточен только на одной проблеме

85
Не могу поймать исключение

Не могу поймать исключение

Всем привет, никак не получается создать условие ,чтобы отловить ошибку ввода в строку букв вместо цифр

86