Загрузка изображения через ajax php и возврат имени изображения в скрытом поле ввода

У меня есть форма с одним полем загрузки изображения.

Я хочу загрузить файл изображения с помощью ajax и заполнить одно скрытое поле в форме возвращенным именем изображения через успех ajax ПЕРЕД ОТПРАВКОЙ ОСНОВНОЙ ФОРМЫ с другими полями ввода, такими как имя, адрес электронной почты, мобильный телефон и т. д....

Следующий код я пробовал, но безуспешно...

HTML-код формы:

<label>Upload File:</label>
  <input name = "userFile" id = "userFile" type = "file" class = "form-control"><br>
  <button name = "marksheet_upload" id = "marksheet_upload" class = "btn btn-success">Upload</button>

<label>Image Final Name</label>
  <input type = "text" class = "form-control" id = "intern_marksheet_image" name = "intern_marksheet_image"> 
 // This above field will be hidden and after image file upload, this value should get via ajax response

<div id = "loader-icon" style = "display:none;"><img src = "images/123.gif"></div>

ЯВАСКРИПТ

<script type = "text/javascript">
$(document).ready(function(){
// File upload via Ajax
   $("#marksheet_upload").click(function(e) {
     var dataimg = new FormData();
     var marksheet = $('#userFile')[0].files[0];
    //append files
    dataimg.append('userFile', marksheet);
    
    
    e.preventDefault();

    $.ajax({
       
        type: 'POST',
        url: 'register-file-upload.php',
        data: dataimg,
        contentType: false,
        enctype: 'multipart/form-data',
        cache: false,
        processData:false,
        beforeSend: function(){
            $('#loader-icon').show();
        },
        
        success: function(response){
            if (response.upload == 'ok'){
                $('#intern_marksheet_image').val(response.image_name);
                $('#loader-icon').html(response.image_error);
                
            }else {
                $('#intern_marksheet_image').val('xxx');
                $('#loader-icon').html(response.image_error);
            }
        }
    });
});
</script>

URL-адрес PHP ajax —

register-file-upload.php код:

 <?php
  function randStrGen601($len){
    $result = "";
    $chars = "0123456789abcdefghijklmnopqrstuvwxyz";
    $charArray = str_split($chars);
      for($i = 0; $i < $len; $i++){
        $randItem = array_rand($charArray);
        $result .= "".$charArray[$randItem];
      }
    return $result;
  }

$error = false;
$imagetypeerror = false;

if (isset($_FILES['userFile'])) {
            $avatar1 = $_FILES['userFile'];
            $avatarname1 = $_FILES['userFile']['name'];
            $avatarsize1 = $_FILES['userFile']['size'];
            $minsize1    = 100000; // 100 KB 
            $maxsize1    = 500000; //500 KB 
            $acceptable1 = array(
                'image/jpeg',
                'image/jpg',
                'image/png'
            );
            
            if (function_exists('finfo_open')){    //(PHP >= 5.3.0, PECL fileinfo >= 0.1.0)
                $fileinfo1 = finfo_open(FILEINFO_MIME_TYPE);
                    if (!empty($avatar1['tmp_name'])){
                        if (!in_array(finfo_file($fileinfo1, $avatar1['tmp_name']), $acceptable1)) {
                            $msg  = "Marksheet Image is not a valid image, Only 'JPG' & 'PNG' Types Are Allowed";                           
                            $error = true;
                            $imagetypeerror = true;
                            
                            $data['upload'] = "Err";
                            $data['image_error'] = $msg;
                            $data['image_name'] = "";
                        }
                    }
            }else if (function_exists('mime_content_type')){  //supported (PHP 4 >= 4.3.0, PHP 5)
                    if (!in_array(mime_content_type($avatar1['tmp_name']), $acceptable1)) {
                            $msg  = "Marksheet Image is not a valid image, Only 'JPG' & 'PNG' Types Are Allowed";
                            $error = true;
                            $imagetypeerror = true;
                            
                            $data['upload'] = "Err";
                            $data['image_error'] = $msg;
                            $data['image_name'] = "";
                        }
            }else{
                if (!@getimagesize($avatar1['tmp_name'])) {  //@ - for hide warning when image not valid
                            $msg  = "Marksheet Image is not a valid image, Only 'JPG' & 'PNG' Types Are Allowed";
                            $error = true;  
                            $imagetypeerror = true;
                    
                            $data['upload'] = "Err";
                            $data['image_error'] = $msg;
                            $data['image_name'] = "";
            }
            }
            
        if (!$imagetypeerror){
            if ( (!isset($avatarname1)) || (empty($avatarname1)) || ($avatarsize1 == 0)) {                               
                            $error = true;
                            $msg= "Please browse and upload the Marksheet Image";                               
                            $data['upload'] = "Err";
                            $data['image_error'] = $msg;
                            $data['image_name'] = "";
            }
            if ( (!empty($avatarname1)) && ($avatarsize1 >= $maxsize1)) {                               
                            $error = true;
                            $msg = 'Marksheet Image Size Is Too Large. Image Must Be Less Than 500 KB.';
                            $data['upload'] = "Err";
                            $data['image_error'] = $msg;
                            $data['image_name'] = "";
            }
            if ( (!empty($avatarname1)) && ($avatarsize1 <= $minsize1)) {                               
                            $error = true;
                            $msg = 'Marksheet Image Size Is Too Small. Image Must Be Greater Than 100 KB.';
                            $data['upload'] = "Err";
                            $data['image_error'] = $msg;
                            $data['image_name'] = "";
            }
        }





 if (!$error){    
         $targetDir = "uploads/intern/";    
         $fileName = $_FILES['userFile']['tmp_name']; 
         $udx = date("YmdHis");
         $random2 = randStrGen601(4);
         $fileName1 = strtolower($fileName);
         $fileName2 = str_replace(" ", "_", $fileName1);
         $targetFilePath = $targetDir.$fileName2; 
 
       // Upload file to the server 
         move_uploaded_file($fileName2, $targetFilePath));
      
        $error = false;
        $data['upload'] = "ok";
        $data['image_error'] = "File Uploaded Successfully";
        $data['image_name'] = $fileName2;       
 
     }
 } 
//returm $data; 
  echo $data;

?>
  

С помощью этого кода я просто получаю «XXX» в качестве имени файла изображения в скрытом поле ввода и загружаю изображение. Изображение не загружается.

Обычный дизайн пользовательского интерфейса: когда пользователь выбирает файл, начинается загрузка (не нужно нажимать кнопку).

Ken Lee 22.03.2024 09:31

@KenLee Спасибо за обновления. Я только что попробовал изменить входной идентификатор файла в js... но пока не получилось найти имя файла скрытого изображения.

Dzine Tech 22.03.2024 09:33

@KenLee Кажется, мне что-то не хватает в коде Register-file-upload.php... как $data['upload.]= "OK"; не возвращается...

Dzine Tech 22.03.2024 09:36
echo $data; - вы не можете вывести массив с помощью echo, результатом будет только текст Array. Вам следует закодировать свой массив как JSON, а затем добавить dataType: "json" к параметрам вызова AJAX jquery.
CBroe 22.03.2024 09:51

@CBroe Я попробовал dataType: "json", но потом ajax не работает... полная страница перезаписана...

Dzine Tech 22.03.2024 09:53

Действительно ли ваш PHP-скрипт теперь возвращает JSON?

CBroe 22.03.2024 09:59

@CBroe Нет… потому что сценарий Ajax не работает, если добавлен тип данных: «json»

Dzine Tech 22.03.2024 10:05

Конечно, это не удастся, если вы дадите jQuery команду проанализировать ответ как JSON, но затем заставите ваш PHP-скрипт возвращать что-то, что не является JSON...

CBroe 22.03.2024 10:20
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
8
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

В исходном коде есть несколько ошибок:

  1. Закрывающие скобки/скобы не совпадают с открывающими скобками/скобками, поэтому добавьте }) в конец $(document).ready блока.

  2. Удалите последний ) из move_uploaded_file($fileName2, $targetFilePath)); (иначе PHP точно не сработает)

  3. Используйте echo json_encode($data) вместо echo $data в вашем PHP-скрипте, иначе мы не сможем правильно вернуть данные массива.

  4. Добавьте dataType: "json", в свой блок ajax, чтобы система оценивала ответ ajax как JSON и возвращала объект JavaScript.

  5. Я немного изменил строки назначения filename, filename1 и filename2, так как считаю их не совсем логичными

  6. Убедитесь, что каталог /uploads/intern/ доступен для записи, чтобы файл можно было загрузить.

Итак, HTML/JS будет:

<script
  src = "https://code.jquery.com/jquery-3.7.1.js"
  integrity = "sha256-eKhayi8LEQwp4NKxN+CfCh+3qOVUtJn3QNZ0TciWLP4 = "
  crossorigin = "anonymous"></script>


<label>Upload File:</label>
  <input name = "userFile" id = "userFile" type = "file" class = "form-control"><br>
  <button name = "marksheet_upload" id = "marksheet_upload" class = "btn btn-success">Upload</button>

<label>Image Final Name</label>
  <input type = "text" class = "form-control" id = "intern_marksheet_image" name = "intern_marksheet_image"> 
<div id = "loader-icon" style = "display:none;">Uploading....</div>




<script type = "text/javascript">
$(document).ready(function(){
   $("#marksheet_upload").click(function(e) {
     var dataimg = new FormData();
     var marksheet = $('#userFile').prop("files")[0];
     dataimg.append('userFile', marksheet);

// if you want to pass additional data say string1, then add something like
//dataimg.append("string1","KEN1");
    
    e.preventDefault();

    $.ajax({
       
        type: 'POST',
        url: 'register-file-upload.php',
        data: dataimg,
        dataType: "json",
        contentType: false,
        enctype: 'multipart/form-data',
        cache: false,
        processData:false,
        beforeSend: function(){
            $('#loader-icon').show();
        },
        
        success: function(response){
            if (response["upload"] == 'ok'){
                $('#intern_marksheet_image').val(response["image_name"]);
                $('#loader-icon').html(response["image_error"]);
                
            }else {
                $('#intern_marksheet_image').val('- failed -');
                $('#loader-icon').html("Not Successful");
            }
        }
    });
});

   })

</script>

и PHP будет следующим (Примечание. Что касается части проверки изображения — я удаляю их, чтобы вы могли сосредоточиться на части загрузки файлов, но вы можете добавить ее обратно)

<?php
function randStrGen601($len){
    $result = "";
    $chars = "0123456789abcdefghijklmnopqrstuvwxyz";
    $charArray = str_split($chars);
      for($i = 0; $i < $len; $i++){
        $randItem = array_rand($charArray);
        $result .= "".$charArray[$randItem];
      }
    return $result;
  }

$error = false;
$imagetypeerror = false;

/*

The image validation part - I remove them so as to focus on the file upload

*/

 if (!$error){    
         $targetDir = "./uploads/intern/";    
         $fileName = $_FILES['userFile']['tmp_name']; 
//         $udx = date("YmdHis");
         $random2 = randStrGen601(4);
         $fileName1 = $random2 . "_". $_FILES['userFile']['name'] ;
         $fileName2 = str_replace(" ", "_", $fileName1);
         $targetFilePath = $targetDir.$fileName2; 
 
       // Upload file to the server 
         move_uploaded_file($fileName, $targetFilePath);
      
        $error = false;
        $data['upload'] = "ok";
        $data['image_error'] = "File Uploaded Successfully";
        $data['image_name'] = $fileName2;       
 
     }
  
//returm $data; 
  echo  json_encode($data);

?>

Дополнительный балл (можно попробовать позже)

Как я уже упоминал, обычный дизайн пользовательского интерфейса таков: когда пользователь выбирает файл, начинается загрузка (нет необходимости нажимать кнопку).

Для этого измените

  $("#marksheet_upload").click(function(e) {

к

  $("#userFile").change(function(e) {

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